c/c++ 标准库 map set 大锅炖
标准库 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<string>::value_type v1("aa");//v1是string类型
set<string>::key_type v2("bb");//v2是string类型
map<string, int >::value_type v3{"aa",12};//v3是pair<const string,int>类型
map<string, int>::key_type v4("cc");//v4是string类型
//只有map才有mapped_type
map<string, int>::mapped_type v5(100);//v5是int类型
三,关联容器的迭代器
当解一个关联容器的迭代器,会得到一个类型为容器的value_type的值的引用。
- 解一个map的迭代器,得到的是pair,key是const的,不可以更改。
- 解一个set的迭代器,得到的是key也是const的,不可以更改。
map<string, int> cnt{{"aa",1}, {"bb",2}};
auto map_it = cnt.begin();
//map_it->first = "new key";//错误,first为const
++map_it->second;
cout << map_it->second << endl;//2
set<int> iset{1,2,2,3,3,5};
set<int>::iterator set_it = iset.begin();
//*set_it = 10;//错误,不可以改变set的key
四,遍历关联容器
当使用迭代器遍历map,multimap,set,multiset时,迭代器按关键字升序遍历元素。
map<string, int> cnt{{"dd",1}, {"cc",2},{"aa", 10}};
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<string> c{"aa","aa","dd","cc"};
vector<string> v{"ee","ff"};
//copy(v.begin(),v.end(), inserter(c, c.end()));//OK
//copy(v.begin(),v.end(), back_inserter(c));//NG,关联容器没有push_back
//copy(c.begin(),c.end(), inserter(v, v.end()));//OK,并且c的begin到end时拍好序的
copy(c.begin(),c.end(), 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 <iostream>
#include <map>
#include <set>
#include <vector>
using namespace std;
int main(){
//test1 关联容器的别名
/*
set<string>::value_type v1("aa");//v1是string类型
set<string>::key_type v2("bb");//v2是string类型
map<string, int >::value_type v3{"aa",12};//v3是pair<const string,int>类型
map<string, int>::key_type v4("cc");//v4是string类型
//只有map才有mapped_type
map<string, int>::mapped_type v5(100);//v5是int类型
*/
//test2 解关联容器的迭代器
/*
map<string, int> cnt{{"aa",1}, {"bb",2}};
auto map_it = cnt.begin();
//map_it->first = "new key";//错误,first为const
++map_it->second;
cout << map_it->second << endl;//2
set<int> iset{1,2,2,3,3,5};
set<int>::iterator set_it = iset.begin();
//*set_it = 10;//错误,不可以改变set的key
*/
//test3 遍历关联容器
/*
map<string, int> cnt{{"dd",1}, {"cc",2},{"aa", 10}};
map<string, int>::const_iterator 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;
}
auto it = cnt.begin();
pair<string, int> p1 = *it;
*/
//test4 关联容器的通用算法
multiset<string> c{"aa","aa","dd","cc"};
vector<string> v{"ee","ff"};
//copy(v.begin(),v.end(), inserter(c, c.end()));//OK
//copy(v.begin(),v.end(), back_inserter(c));//NG,关联容器没有push_back
//copy(c.begin(),c.end(), inserter(v, v.end()));//OK,并且c的begin到end时拍好\\
序的
copy(c.begin(),c.end(), back_inserter(v));
for(auto &s : c){
cout << s << " ";
}
cout << endl;
for(auto &s : v){
cout << s << " ";
}
cout << endl;
return 0;
}
c/c++ 学习互助QQ群:877684253
本人微信:xiaoshitou5854
c/c++ 标准库 map set 大锅炖的更多相关文章
- c/c++ 标准库 map multimap元素访问
标准库 map multimap元素访问 一,map,unordered_map下标操作 下标操作种类 功能描述 c[k] 返回关键字为k的元素:如果k不在c中,添加一个关键字为k的元素,并对其初始化 ...
- c/c++ 标准库 map set 删除
标准库 map set 删除 删除操作 有map如下: map<int, size_t> cnt{{2,22}, {3,33}, {1,11}, {4,44}; 删除方法: 删除操作种类 ...
- c/c++ 标准库 map set 插入
标准库 map set 插入 一,插入操作 有map如下: map<string, size_t> cnt; 插入方法: 插入操作种类 功能描述 cnt.insert({"abc ...
- C++之标准库map
目录 1.成员函数 2.元素访问 3.迭代器Iterators(C++ 11) 4.容量Capacity 5.修改函数(C++ 11和C++ 17) 6.查找表Lookup 7.观察Observers ...
- C++ Primer 有感(标准库map类型)
map是键-值对的集合.map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样.而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取. 1.map对 ...
- c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑
转自:http://blog.csdn.net/truexf/article/details/17303263 一.vector vector采用一段连续的内存来存储其元素,向vector添加元素的时 ...
- STL标准库-容器-set与map
STL标准库-容器-set与multiset C++的set https://www.cnblogs.com/LearningTheLoad/p/7456024.html STL标准库-容器-map和 ...
- Python标准库13 循环器 (itertools)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在循环对象和函数对象中,我们了解了循环器(iterator)的功能.循环器是对象的 ...
- 《C++ Primer》学习笔记【第二部分 C++标准库】
第8章 IO库 IO对象不能复制,即1.IO对象不能存储在vector或其他容器中 2.如果需要传递或返回IO对象,必须传递或返回指向该对象的指针或引用. 一般情况下,如果要传递IO对象以便对它进 ...
随机推荐
- lucene-solr本地调试方法
1.下载并编译lucene-solr的源代码,并导入 eclipse sts等 2.修改SolrDispatchFilter的solr.solr.home属性,我们这里将其直接修改为一个本地绝对路径, ...
- Go基础系列:数据类型转换(strconv包)
Go不会对数据进行隐式的类型转换,只能手动去执行转换操作. 简单的转换操作 转换数据类型的方式很简单. valueOfTypeB = typeB(valueOfTypeA) 例如: // 浮点数 a ...
- Entity Framework Core 中文入门文档
点击链接查看文档: Entity Framework Core 中文入门文档
- nginx支持跨域访问
1,进入nginx的html目录 vim ./crossdomain.xml 具体路径: /usr/local/nginx/html/crossdomain.xml 2,在crossdomain.xm ...
- [android] listview入门
Listview组件非常重要,4分之一的时间都是在搞这个,还是通过上一节的数据库,写个for循环,插入50条数据. 先使用笨方法显示数据,根布局LinearLayout 定义一个id,在activit ...
- [leetcode]1007. 行相等的最少多米诺旋转
在一排多米诺骨牌中,A[i] 和 B[i] 分别代表第 i 个多米诺骨牌的上半部分和下半部分.(一个多米诺是两个从 1 到 6 的数字同列平铺形成的 —— 该平铺的每一半上都有一个数字.) 我们可以旋 ...
- 【Java每日一题】20170228
20170227问题解析请点击今日问题下方的“[Java每日一题]20170228”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; import jav ...
- C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】
一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...
- Mac包管理神器Homebrew
概念 简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,相当于Red hat的yum.Ubuntu的apt-get. 安装命令 ruby -e "$( ...
- js 正则表达式之环视结构
一.环视 1:环视不“占用”字符,只匹配字符所在的特定位置. 2:正则表达式是从左向右进行匹配的. 二.肯定顺序环视(?=....) 子表达式匹配当前位置的右侧字符 图中:红色表示当前位置,绿色表示正 ...