您的位置:首页 > 其它

第十章 关联容器(下)

2015-08-21 08:45 302 查看
1.set类型的关联容器
set容器跟map容器相类似,只不过set的容器只是单纯的键的集合。set容器不支持下标操作,元素类型不是value_type类型,而是key_type类型。即set容器仅仅只存储键,而没有所关联的值。与map容器一样,存储的键也必须是唯一的,不能修改。

2.set的容器的定义

set<T>iset;创建一个空的set的对象iset,元素类型为T。

set<T>iset(b,e);创建一个set的对象iset,有迭代器b和e指定范围的元素初始化,元素必须是T类型。

3.set的容器的添加元素

由于set容器不支持下标操作,所以只有与map容器一样采用insert操作来添加元素。

set<string>set1("liujiyu"),set2("nihao");

set1.insert(set2.begin(),set2.end());

4.set容器读取相应的元素

set容器和map容器获取元素的时候不同,set的容器采用find和count成员函数来获取元素。

set<int>iset;

iset.find(a);查找整数a的值,如果存在,则返回指向a的位置的迭代器。否则返回指向set.end()的迭代器

iset.count(a);查找整数a出现的次数。在set的容器中,count成员函数返回的只有0或者1

5.遍历set容器的元素

这个操作跟map容器一样,通过迭代器来遍历,唯一不同的是set的容器仅仅只有键值,所以直接对其进行解引用就可以得到相应的键值。

6.multimap和multiset容器

multimap容器是是一个键对应多个不同的值。multiset就是存在多个相同的键。并且multimap不支持下标操作。

multimap和multiset容器的添加删除元素:

添加元素的操作是采用insert操作来实现的。插入之后相应的键值就是按照从小到大的顺序排列的。

删除元素的操作是采用erase来实现的。该删除操作是删除所有相同的键的元素。

7.multimap和multiset容器中查找元素

查找元素主要通过find和count来个成员函数共同来完成,通过find成员函数找到相应键的第一个位置,count成员函数统计该键出现的次数。然后再利用一个循环将这相同键的元素都输出。

如:multimap<string,int>imulmap;

string s;

while(cin>>s){

imulmap.insert(make_pair(s,2));}

string s1;cin>>s1;

multimap<string,int>::iterator it=imulmap.find(s1);

multimap<string,int>::size_type ix=imulmap.count(s1);

for(multimap<string,int>::size_type itt=0;itt!=ix;++itt)

cout<<it->first<<" "<<it->second;

8.与众不同的面向迭代器的解决方案

以下操作适合所有的关联容器:

m.lower_bound(k) 返回一个迭代器,指向键不小于k的第一个元素

m.upper_bound(k)   返回一个迭代器,指向键大于k的第一个元素

m.equal_range(k)    返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k),而second成员等价于m.upper_bound(k)  

如:multimap<string,int>imulmap;

string s;

while(cin>>s){

imulmap.insert(make_pair(s,2));}

string s1;cin>>s1;

multimap<string,int>::iterator beg=imulmap.lower_bound(s1),end=imulmap.upper_bound(s1);

while(beg!=end){

cout<<beg->first<<" "<<beg->second<<endl;

++beg;}

使用equal_range函数:multimap<string,int>imulmap;

string s;

while(cin>>s){

imulmap.insert(make_pair(s,2));}

string s1;cin>>s1;

pair<multimap<string,int>::iterator,multimap<string,int>::iterator> iter=imulmap.equal_range(s1);

while(iter.first!=iter.second){

cout<<iter.first->first<<" "<<iter.first->second<<endl;

++iter.fisrt;}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: