顺序容器是通过元素在容器中的位置来顺序访问的,关联容器则不同,是通过键来存储和读取元素的。常用的顺序容器有一下几种:
map元素通过键值来存取元素
set键的集合
multimap同一个键出现多次的map
multiset同一个键出现多次的set
下面只介绍map
1、map
(1) map<k, v>中的键的类型必须定义"<"操作。
(2) map定义的类型
map<k, v>::key_type键的类型,为const类型
map<k, v>::mapped_type值的类型
map<k, v>::value_typepair类型,第一个元素为const map<k, v>::key_type,
第二个为map<k, v>::mapped_type
(3) 访问——通过下标,副作用
map<string, int> word_count;
word_count["andy_jiang"];
这种方式会有副作用。当要访问的元素不存在时,将在map中会添加一个新的元素。(4) 添加元素——下标,insert
使用下标的副作用,可以为容器添加元素。也可以直接使用insert插入元素。
word_count.insert("andy lau");
注意:insert()有三版本,需要注意insert接受单个值的返回类型。insert(e),其中,e为value_type类型,包含一个指向e.first元素的map迭代器,以及一个bool类型值,表明是否插入成功。
例子——单词统计程序
map<string, int> word_count;
string word;
while(cin >> word)
{
pair<map<string, int>::iterator, bool> ret = word_count.insert(make_pair(word, 1));
if(!ret.second)
{
++ret.first->second;
}
}
上面的例子中,ret.second为bool类型。如果pair对插入成功,则word初始化为1。已存在map容器中,则插入失败,但是要对单词出现次数增1。
(5)删除元素——erase
m.erase(k),带有一个键参数的此版本,将返回删除的元素的个数,其他版本则返回void。在map容易中,返回值只能为1或者0。
2、map的上述几点是比较容易出错和混淆的。set、multimap、multiset的操作与map大致相同。