关联容器支持高效的关键词查找和访问。 两个主要的关联容器类型是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()