stl关联容器
2016-04-15 21:43
344 查看
stl关联容器
总共有8个关联容器,体现在三个不同的纬度上:1)是一个map,还是一个set
2)是否允许重复的关键字
3)是否需要按照顺序保存
使用关联容器
map<string,size_t> word_count;//string到size_t的空map string word; while(cin>>word) ++word_count[word];//提取word的计数器并将其加1 for(const auto &w : word_count)//对map中的每个元素 cout<<w.first<<" occurs "<<w.second << ((w.second > 1)?"times":"time") <<endl;
使用下标运算符时,如果不存在,则创建一个新的元素,值初始化
map<string,size_t> word_count; set<string> excludes = {"The","But","And","Or","An","A"}; string word; while(cin>>word) if(excludes.find(word) == exclude.end()) ++word_count[word];
定义关联容器
map<string,size_t> word_count;//空容器 //列表初始化 set<string> excludes = {"The","But","And","Or","An","A"}; //三个元素;authors将映射为名 map<string,string> authors = {{"Joyce","James"}};
关键字类型的限制
“行为正常”的<运算符的要求两个关键字不能够同时“小于等于”对方
如果k1“小于等于”k2,且k2“小于等于”k3,则k1“小于等于”k3
如果两个关键字均不“小于等于”对方,则两者等价
比较操作也是容器类型的一部分
multiset<Sales_data,decltype(compareIsbn)*> bookstore(compareIsbn);
pair类型
pair上的操作pair<T1,T2> p;//p是一个pair,两个类型分别为T1和T2的成员都进行了值初始化 pair<T1,T2> p(v1,v2);//p是一个成员类型为T1和T2的pair,first和second分别使用v1和v2初始化 pair<T1,T2> p = {v1,v2}; make_pair(v1,v2);//返回一个用v1,v2初始化的pair,类型由v1和v2推断
关联容器操作
pair的关键字是const的,我们可以改变pair的值,但是无法改变关键字成员的值auto map_it = word_count.begin(); //*map_it是指向pair<const string,size_t>对象的引用 cout<<map_it->first; cout<<" "<<map_it->second; map_it->first = "new key";//错误!!!,first是const的 ++map_it->second;//正确
set的迭代器是const的
遍历迭代器
auto map_it = word_count.cbegin(); while(map_it!=word_count.cend()){ cout<<map_it->first<<" occurs "<<map_it->second <<" times "<<endl; ++map_it; }
添加元素
map<string,size_t> word_count;//从string到size_t的空map string word; while(cin>>word){ //插入一个元素,关键字等于word,值为1 auto ret = word_count.insert({word,1}); if(!ret.second)//word已经在word_count中 ++ret.first->second; }
如果是multimap类型,insert函数返回是指向新元素的迭代器,无需返回bool值
删除元素
有三种erase方法可以调用c.erase(k)
从c中删除每个关键字为k的元素。返回一个size_type值,指出删除元素的数量
c.erase(p)
从c中删除迭代器p指向的元素
c.erase(b,e)
从c中删除迭代器对b和e所表示的范围中的元素。返回e
map的下表操作
下标 VS atc[k] 返回关键字为k的元素;如果k不在c中,添加一个关键字为k的元素,对其进行值初始化
c.at(k) 若k不在c中,抛出一个out_of_range异常
访问元素
find / count对于有序容器来说,lower_bound / upper_bound
在mutlimap和multiset中查找元素
string search_item("Alain de Botton"); auto entries = authors.count(search_item); auto iter = authors.find(search_item); while(entries){ cout<<iter->second<<endl; ++iter; --entries; }
for(auto pos = c.equal_range(search_item);pos.first!=pos.second;++pos.first) cout<<pos.first->second<<endl;
无序容器
通常,无序容器和有序容器可以互相替换无序容器对关键字类型的要求
haser函数== 运算符
相关文章推荐
- 浅析STL中的常用算法
- STL区间成员函数及区间算法总结
- c++ STL容器总结之:vertor与list的应用
- C++在成员函数中使用STL的find_if函数实例
- 关于STL中list容器的一些总结
- 关于STL中的map容器的一些总结
- 浅析stl序列容器(map和set)的仿函数排序
- STL list链表的用法详细解析
- stl容器set,map,vector之erase用法与返回值详细解析
- STl中的排序算法详细解析
- 关于STL中vector容器的一些总结
- 关于STL中set容器的一些总结
- 简单说说STL的内存管理
- STL与泛型编程(1)---模板
- CppUtest发现的STL容器内存泄漏问题
- STL中算法
- STL简单应用
- vector-list-deque
- 三十分钟掌握STL
- Qt中QSet的使用