C++ 关联容器, map,set
关联容器支持高效的关键词查找和访问。 两个主要的关联容器类型是map和set
map 中的元素是关键字-值对应(key - value)。 关键字起到了索引的作用
set 中只有一个关键字, set 支持高效的关键字查询操作- 检查一个给定的关键字是否在set 中。
关联容器的类型
按关键字有序的保存元素
map // 关联数组: 保存关键字-值
set // 关键字即值,即只保存关键字的容器
mutimap //关键字可重复出现的map
multiset // 关键字可重复出现的set
无序集合
unordered_map // 用哈希函数组织的map
unordered_set // 用哈希函数组织的set
unordered_multiset // 用哈希组织的multiset
unordered_multimap // 用哈希组织的mutimap
map,set 操作
如果不知道pair 点击这里
map<key,value> m // key 是可以比较大小的数据类型,value 是它对应的值
key_type // 此容器的关键字类型
mapped_type // 每个关键字关联的类型,只是用于map
value_type /* 对于set,与key_type 相同,对于map, 为pair<const key_type,mapped_type> */
set<string> :: value_type v1; // v1 是一个string
set<string> :: key_type v2; // v2 是一个string
set<string,int>:: value_type v3;// v3 是一个pair<const string,int>
set<string,int> :: key_type v4; // v4 是一个string
set<string,int> :: mapped_type v5; // v5是一个int
获取迭代器
set<T> :: iterator it1;
map<T1,T2> :: iterator it2;
set 添加元素
vector<int> ivec = {1,2,3,4,4,3,3};
set<int> set2;
set2.insert(ivec.begin(),ivec.end()); // set 现在有 1,2,3,4 四个元素
set2.insert({7,8,9,10}); // set 现在由八个元素
map 添加元素
map<string,int> si;
si.insert({s,1});
si.insert(make_pair(s,1));
si.insert(pair<string,int> (s,1));
删除元素
c.erase(k) ; /* 从 c 中删除每个关键字为k的元素。 返回一个size_type 值,指出删除元素的数*/ //因为对于multi_set 和multi_map ,可能有多个相同的关键字
c.erase(p) /* 从c中删除迭代器p 指定的元素。 p 必须指向c中一个真实元素,不能等于c.end() . */ // 返回一个指向p之后元素的迭代器,若p指向c中的尾元素,返回c.end()
c.erase(a,b) ; // 删除迭代器a,b 所指范围内的元素,返回b
map 的下标操作
map <string,size_t > word;
// 插入一个关键字为“Mary" 的元素,关联值进行值初始化; 然后将1赋予它
word_count["Mary"] = 1;
/* 在word 中搜索关键字为Mary 的元素,未找到 将一个新的关键字-值对插入到word中。 关键字是Mary, 值进行值初始化, 在本例中int 初始化为0 提取出新插入的元素,并将值1 赋予它 */
访问元素
c.find() // 返回一个迭代器,指向第一个关键字为k的元素,若k不在容器中,则返回尾后迭代器
c.count() // 返回关键字等于k的数量
对于不允许重复关键字的容器,find 和count 没什么区别,但对于允许重复关键字的容器,count 还可以输出数量。 所以如果不需要计数,使用find,否则使用count
// 先看一个例子
set<int> iset = {0,1,2,3,4,5,6,7,8,9};
iset.find(1); // 返回一个迭代器,指向key == 1 的元素
iset.find(11); // 返回一个迭代器,iset.end()
iset.count(1); // 返回1
iset.count(11); // 返回0
multiset<int> iset = {0,1,1,2,3,4,5,6,7,8,9};
iset.count(1); // 返回2
c.lower_bound(k) ; //返回一个迭代器,指向第一个关键字不小于k的元素
c.upped_bound(k) ; //返回一个迭代器,指向第一个关键字大于k的元素
c.equal_range(k) ;
//返回一个迭代器pair,表示关键字等于k的元素的范围。 若k不存在,均为c.end()