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;}