标准库 map set 大锅炖
一,关联容器有哪些
按关键字有序保存元素
map
保存key和value
set
只保存key
mulutimap
key可以重复出现
multiset
key可以重复出现
无序集合
unordered_map
用哈希函数做成的map
unordered_set
用哈希函数做成的set
unordered_mulutimap
key可以重复出现
unordered_multiset
key可以重复出现
二,关联容器的类型别名
类型别名
key_type
关键字(key)的类型
value_type
set的话,和key_type一样;map的话,是个pair
mapped_type
只适用于map,值(value)的类型
set
set
map
map
//只有map才有mapped_type
map
三,关联容器的迭代器
当解一个关联容器的迭代器,会得到一个类型为容器的value_type的值的引用。
解一个map的迭代器,得到的是pair,key是const的,不可以更改。
解一个set的迭代器,得到的是key也是const的,不可以更改。
map
auto map_it = cnt.begin();
//map_it->first = "new key";//错误,first为const
++map_it->second;
cout << map_it->second << endl;//2
set
set
//*set_it = 10;//错误,不可以改变set的key
四,遍历关联容器
当使用迭代器遍历map,multimap,set,multiset时,迭代器按关键字升序遍历元素。
map
auto map_it = cnt.cbegin();
while(map_it != cnt.cend()){
cout << map_it->first << ":" << map_it->second << endl;
++map_it;
}
for(auto &s : cnt){
cout << s.first << ":" << s.second << endl;
}
五,对关联容器使用泛型算法
通常不对关联容器使用泛型算法,因为关联容器有key为const特性,很多算法不适用
关联容器可用于只读算法,但是这些算法都需要搜索序列,比如find算法。但是关联容器有关键字,所以还莫不如用关联容器自己的find成员方法来的效率高。
实际中,一般对关联容器,使用copy算法比较多
multiset
vector
//copy(v.begin(),v.end(),inserter(c,c.end()));//OK
//copy(v.begin(),back_inserter(c));//NG,关联容器没有push_back
//copy(c.begin(),c.end(),inserter(v,v.end()));//OK,并且c的begin到end时拍好序的
copy(c.begin(),back_inserter(v));//OK
for(auto &s : c){
cout << s << " ";
}
cout << endl;
for(auto &s : v){
cout << s << " ";
}
cout << endl;
小例子索引
代码块
test1
关联容器的别名
test2
解关联容器的迭代器
test3
遍历关联容器
test4
对关联容器通用算法
小例子:
#include
#include
#include
#include
using namespace std;
int main(){
//test1 关联容器的别名
/*
set
set
map
*/
//test2 解关联容器的迭代器
/*
map set //*set_it = 10;//错误,不可以改变set的key */ //test3 遍历关联容器 /* map map while(map_it != cnt.cend()){ cout << map_it->first << ":" << map_it->second << endl; ++map_it; } for(auto &s : cnt){ cout << s.first << ":" << s.second << endl; } auto it = cnt.begin(); pair */ //test4 关联容器的通用算法 multiset 序的 copy(c.begin(),back_inserter(v)); for(auto &s : c){ cout << s << " "; } cout << endl; for(auto &s : v){ cout << s << " "; } cout << endl; return 0; } github完整代码 版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。