1、关联容器支持通过键来高校地查找和读取元素,两个基本的关联容器类型是map和set。map的元素以键-值对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。
2、关联容器类型:
map 关联数组:元素通过键来存储和读取
set 大小可变的集合,支持通过键实现的快速读取
multimap 支持同一个键多次出现的map类型
multiset 支持同一个键多次出现的set类型
3、pair类型:pair包含两个数据值,也是一种模板类型,pair对象所包含的两个数据成员各自对应的类型名字,这两个类型不必相同。
pair类型提供的操作:
pair<T1,T2> p1; 创建一个空的pair对象,它的两个元素分别为T1和T2类型,采用值初始化
pair<T1,T2> p1(v1,v2);
make_pair(v1,v2) 以v1和v2值创建一个新的pair对象,其元素类型分别是v1和v2的类型
p1 < p2 两个pair对象之间的小于运算,如果p1.first < p2.first 或者!(p2.first < p1.first)&&p1.second < p2.second , 则返回true
p1 == p2
p.first 返回p中名为first的(公有)数据成员
p.second 返回p的名为second的(公有)数据成员
4、关联容器不提供front、push_front、pop_front、back、push_back以及pop_back操作。关联容器元素根据键的次序排列。关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。
5、map的构造函数:
map<k,v> m;
map<k,v> m(m2);
map<k,v> m(b,e); 创建map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转换为pair尖左括号const k,v尖右括号
6、键类型必须定义<操作符,而且该操作符应能“正确地工作”
7、map<string,int> word_count;
word_count["Anna"] = 1;
程序执行过程如下:
1)在word_count中查找键为Anna的元素,没有找到。
2)将一个新的键-值对插入到word_count中,它的键是const string类型的对象,保存Anna,而它的值则采用值初始化,这就意味着本例中值为0.
3)将这个新的键-值对插入到word_count中。
4)读取新插入的元素,并将它的值赋为1。
只有在所查找的键不存在时,map容器才为该键创建一个新的元素,并将它插入到此map对象中。
8、map容器提供的insert操作:
m.insert(e); 返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素
m.insert(beg,end); 返回void类型
m.insert(iter,e); e是一个用在m上的value_type类型的值,如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。返回一个迭代器,指向m中具有给定键的元素
m.count(k) 返回m中k的出现次数
m.find(k) 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器,如果不存在,则返回超出末端迭代器
9、从map对象中删除元素:
m.erase(k) 返回size_type类型的值,表示删除的元素个数
m.erase(p) 返回void类型
m.erase(b,e) 返回void类型
10、set容器只是单纯的键的集合。当只想知道一个值是否存在时,使用set容器最合适。set中的键为const,在获得指向set中某元素的迭代器后,只能对其做读操作,而不能做写操作。
11、multimap和multiset类型:
如果某个键对应多个实例,则这些实例在容器中将相邻存放。
返回迭代器的关联容器操作:
m.lower_bound(k) 返回一个迭代器,指向键不小于k的第一个元素
m.upper_bound(k) 返回一个迭代器,指向键大于k的第一个元素
m.equal_range(k) 返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k),而second成员则等价于m.upper_bound(k)