两个基本的关联容器:
map: 关联数组, 元素通过键来存储和读取
set: 集合,
multimap: 同一个键可多次出现的map
multiset: 同一个键可多次出现的set
pair类型 : 头文件 utility
map 类型: 头文件 map
构造函数:
map<k,v> m;
map<k,v>m(m2); 创建m2的副本
map<k,v> m(b,e); 存储迭代器b 和 e 标志的范围内的元素的副本。元素的类型必须能转换成pair<const k,v>
键类型的约束:
关联容器中,键不但有一个类型,还有一个相关的比较函数。
唯一的约束是必须支持< 操作符,支持其他的关系或相等运算,不做要求
map 定义的类型:
map<K,V>::key_type map容器中,用作索引的键的类型
map<K,V>::mapped_type map容器中,键所关联的值的类型
map<K,V>::value_type pair 类型, first 元素具有 const map<K,V>::key_type 类型 ;second 元素具有map<K,V>::mapped_type 类型
注意:value_type 是pair 类型,它的值成员可以修改,但键成员不可以。
map迭代器 解引用 是 pair 类型的对象
給map 添加元素:
1、使用下标访问map对象。
注意:用下标访问不存在的元素会导致在map容器中添加一个新的元素,键为下标值。
下标操作符返回的值 与 对 map迭代器进行解引用获得的类型不用。
区别:
map 迭代器返回的是: value_type类型,即 pair<const key_type, mapped_type>
下标操作符: mapped_type 类型
map::insert
1)m.insert(e): e 的类型是 在m上的value_type 类型。
键(e.first) 不在m中: 插入值为 e.second 的新元素
键(e.first) 已在m中: 保持m不变
返回值: 一个pair类型。 <指向键为e.first的元素的迭代器, bool类型>
m中是否存在 键 e.first 返回值的区别:不在的话 返回值pair 里面的bool为假,否则为真
EX: map<string, int> word_count;
word_count.insert( map<string,int>::value_type("Anna",1));
简化的:
word_count.insert( make_pair("Anna",1) );
typedef map<string,int>::value_type valType
word_count.insert( valType("Anna",1));
上面的插入返回的pair 类型如下:
pair< map<string,int>::iterator, bool>
2)m.insert(beg,end); 插入beg 和 end 范围内的元素的副本, 类型必须是m.value_type。
返回void
3)m.insert(iter,e) 跟第一个插入方式一样,iter 的作用不是很明白。
查找并读取map 的元素:
m.count(k) 返回m中k的出现次数
m.find(k) 如果存在k索引的元素,返回指向该元素的迭代器。否则,返回超出末端迭代器。
map 中删除元素:
m.erase(k) 删除m中 键为 k 的元素。返回删除的元素个数,类型:size_type
m.erase(p) 删除 迭代器p指向的元素,返回void
m.erase(b,e) 删除 b e之间的元素副本,返回void
再次记住: const string & 可以用实参string 或 c_str c 风格字符串 传递参数。