关联容器



1.        关联容器主要是通过键来高效查找和读取元素。map和set,map是键和值,set仅包含一个键,并有效支持关于某个键是否存在的查询。

2.        set:存储不同值的集合,如做文本处理时,要忽略的单词。黑名单的建立和使用

3.        map适用于存储每个键所关联的值得情况,如字典,单词本身是键,解释说明是值。

4.        pair类型,保存在utility头文件中。

[1]      pair的创建和初始化

pair<string,string>author(“james”,”joyce”);

pair<string,int>word_count;

如果不初始化,则调用默认构造函数进行初始化。

由于比较繁琐,可以利用typedef简化声明。

[2]      pair对象的操作

与其他标准类型不同,可以直接访问其数据成员。

string firstBook;

if(author.first==”james”&&author.second==”joyce”)

firstBook=”Stephen Hero”;

[3]      生成新的pair对象

make_pair函数

pair<string,string>next_auth;

string first,last;

while(cin>>first>>last)

{

 next_auth = make_pair(first,last);

}

5.        关联容器不提供front,push_front、pop_front、back、push_back及pop_back操作。

6.        map类型(包含在map头文件中)

[1]      map对象的定义

map<string,int>word_count; //string是键,关联的值是int型。map的键类型必须支持<操作。

[2]      map定义的类型

map<K,V>::key_type  在map容器中,用作索引的键的类型

map<K,V>::mapped_type  键所关联的值得类型

map<K,V>::value_type  一个pair类型,他的键为const。

[3]      map迭代器进行解引用将产生pair类型的对象,实现输出啦

map<string, int>::iterator map_it = word_count.begin();

//*map_it 是一个pair类型的引用哟

cout << map_it->first;

++map_it->second;

[4]      可以通过作用域操作符来获取类型成员:

map<string, int>::key_type

7.        map键和值的输出

for(map<string,int>::iterator iter = word_count.begin();

         iter!=word_count.end();++iter)

 

{

         cout << iter->first<<"\t\t"

         <<(*iter).second<<endl;

 

 

}

8.        给map添加元素

[1]      使用下标,不过只有在键不存在时才能插入。

map<string, int>word_count;

string word;

while(cin >> word)

++word_count[word];

map类型这个返回mapped_type类型的值,所以可以用来统计单词啦,如果没有则插入,初始值为0,然后值立即加1,如果存在就加1啦。

[2]      map::insert的使用

A.       m.insert(e):

e是一个value_type的值,如果e.first不在m中,则插入一个值为e.second的新元素。返回pair类型对象,包含指向e.first的迭代器和一个bool类型的对象,表示是否插入元素。

B.       m.insert(beg,end)

beg end是迭代器,其中元素为m.value_type的键值对。对于该范围内的元素,如果键在m中不存在,则将该键和关联值插入m,返回void类型

C.        m.insert(iter, e )

e是一个value_type类型的,如果e.first不在m中,则创建元素,并以跌大气为起点搜索新元素存储的位置。返回迭代器,指向m中具有给定键的元素。

9.        插入元素

word_count.insert(map<string, int> ::value_type (“Anna”,1));

如果Anna在word_count不存在,就插入一个值为1的新元素Anna

简化:

word_count.insert(make_pair(“Anna”,1));

或者使用typedef

typedefmap<string, int>::value_type valType;

word_count.insert(valType(“Anna”,1));

10.     用insert函数返回一个迭代器和一个bool值的pair对象。其中迭代器指向map中相应键的元素,bool表示是否插入了该元素。

pair<map<string,int>::iterator,bool> ret =

                   word_count.insert(make_pair(word,1));//注意是插入pair类型

         if(!ret.second)

         ++ret.first->second;

11.     查找并读取map中的元素

m.count(k)   返回m中k的出现次数,返回值只能是0或1,检查某键是否存在

m.find(k)   如果存在k索引的元素,返回指向该元素的迭代器,否则返回超出末端迭代器。适合查找指定键所对应的值啦。

12.     从map中删除元素,map容器的erase返回void,而顺序容器的erase返回指向被删除元素后面元素的迭代器。

m.erase(k)   删除m中键为k的元素,返回size_type类型的值,表示删除的元素个数。

m.erase(p)   从m中删除迭代器p所指向的元素,p必须指向m中确实存在的元素,切不能等于m.end,返回void类型。

m.erase(b,e)    删除be之间的元素。b必须大于等于e,返回void

13.     还可以直接删除key_type类型的值

if(word_count.erase(word));如果元素存在,就删除该元素。返回删除元素的个数,0或1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值