1、关联容器与顺序容器的本质区别
关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
2、关联容器的类型
map 、set、multimap、multiset
3、pair类型
pair类型的比较:
p1<p2 :两个pair对象之间的小于运算,其定义遵循字典次序:如果p1.first < p2.first 或者 !(p1.first < p2.first) && (p1.second< p2.second),则返回true;
p1 == p2: 如果两个pair对象的first和second成员依次相等,则这两个对象相等,(该运算使用其元素的==操作符)
4、map类型
map<k, v> m; //创建空的map对象,其键和值得类型分别为k和v;
map<k, v> m(m2);
map<k, v> m(b,e);
注意:键值应能够比较
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类型。
注意:map的value_type是pair类型,它的值成员可以修改,但键成员不能修改(类型为const map<K,V>::key_type,只读)。
map迭代器进行解引用将产生pair类型的对象
<1>、map类型的操作
**1、通过下标访问map对象
注意:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。
例:map<string, int> word_count;
word_count["Anna"] = 1;
将有以下操作:
在word_count中查找键为Anna的元素,没有找到;
将一个新的键-值对插入到word_count中,它的键是const string类型,保存为Anna, 而它的值初始化为0;
读取新插入的元素,并将它的值赋为1;
map下标操作返回的左值是特定键所关联的值。
<2>、map::insert的使用
注意insert的返回值;
是一个pair类型,first成员是map迭代器,second成员是bool型,first成员指向map中已存在的值,second标识插入操作是否成功。
<3>、查询操作
m.count(k);//返回m中k键出现的次数。
m.find(k);//查找m容器中是否存在k键,存在返回指向该元素的迭代器,不存在,返回超出末端的迭代器。
<4>、从map中删除元素
m.erase(k);//删除m中键为k的元素,返回size_type类型的值,表示删除的元素的个数。
m.erase(p);//从m中删除迭代器p所指向的元素。p必须指向m中确实存在的元素,而且不能等于m.end(),返回void类型。
m.erase(b,e);//从m中删除一段范围内的元素,该范围由迭代器对b和e标记。b和e必须标记m中的一段有效范围。返回void类型。
5、set类型
map是键-值对的集合,set容器是单纯的键的集合
set支持大部分的map操作,但是set不支持下标操作符,set容器中存储的键必须为唯一的,而且不能修改。
6、multimap和multiset类型
1**、注意multimap不支持下标操作(因为某个键可能对应多个值)
2**、在multimap和multiset中,如果某个键对应多个实例,则这些实例在容器中将相邻存放。
3**、在multimap和multiset中查找元素所使用的三种方法
<1>、find和count
<2>、lower_bound和upper_bound
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);
在同一个键上调用lower_bound和upper_bound,将产生一个迭代器范围,指示出该键所关联的所有元素。
如果查找的键不在multimap中,则这两个操作将返回同一个迭代器,指向依据元素的排列顺序该键应该插入的位置。
例:
typedef multimap<string, string>::iterator author_it; author_it beg = author.lower_bound("Barth,John"); author_it end = author.upper_bound("Barth,John"); while(beg != end) { cout<<beg->first <<"---"<<beg->second<<endl; beg++; }
<3>、equal_range函数
pair<author_it, author_it> pos = author.equal_range("Barth,John"); while(pos.first != pos.second) { cout<<pos.first->first<<"---"<<pos.first->second<<endl; ++pos.first; }