pair 类型
pair<T1, T2> p1; 创建一个空的 pair 对象,它的两个元素分别是 T1 和 T2类型,采用值初始化(第 3.3.1 节)
pair<T1, T2> p1(v1, v2); 创建一个 pair 对象,它的两个元素分别是 T1 和 T2 ,其中 first 成员初始化为 v1,而 second 成员初始化为 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 如果两个 pair 对象的 first 和 second 成员依次相等,则这两个对象相等。该运算使用其元素的 == 操作符
p.first 返回 p 中名为 first 的(公有)数据成员,即T1值
p.second 返回 p 的名为 second 的(公有)数据成员,即T2值
pair创建和初始化
pair<string, vector<int> > line; // holds string and vector<int>
typedef pair<string, string> Author;
Author proust("Marcel", "Proust");
if (author.first == "James" && author.second == "Joyce")
firstBook = "Stephen Hero";
next_auth = make_pair(first, last); == next_auth = pair<string, string>(first, last);
关联容器类型
map 关联数组:元素通过键来存储和读取
set 大小可变的集合,支持通过键实现的快速读取
multimap 支持同一个键多次出现的 map 类型
multiset 支持同一个键多次出现的 set 类型
map 类型
map 是键-值对的集合。map 类型通常可理解为关联数组(associativearray):可使用键作为下标来获取一个值,正如内置数组类型一样。(value type)
构造函数
map<k, v> m; 创建一个名为 m 的空 map 对象,其键和值的类型分别为 k 和 v
map<k, v> m(m2); 创建 m2 的副本 m,m 与 m2 必须有相同的键类型和值类型
map<k, v> m(b, e); 创建 map 类型的对象 m,存储迭代器 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 类型
在学习 map 的接口时,需谨记 value_type 是 pair 类型,它的值成员可以修改,但键成员不能修改
map<string, int>::iterator map_it = word_count.begin();
// *map_it is a reference to a pair<const string, int> object
cout << map_it->first; // prints the key for this element
cout << " " << map_it->second; // prints the value of the element
map_it->first = "new key"; // error: key is const
++map_it->second; // ok: we can change value through an iterator
map <string, int> word_count; // empty map
// insert default initialzed element with key Anna; then assign 1 to its value
word_count["Anna"] = 1;
使用下标访问 map 与使用下标访问数组或 vector 的行为截然不同:用下标访问不存在的元素将导致在 map 容器中添加一个新元素,它的键即为该下标值。
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));
map 对象中一个给定键只对应一个元素。如果试图插入的元素所对应的键已在容器中,则 insert 将不做任何操作。返回值为pair<map<string, int>::iterator, bool>,如果该pair已存在,则返回false。
map查询
m.count(k) 返回 m 中 k 的出现次数 ,只能是0或1。
m.find(k) 如果 m 容器中存在按 k 索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器。
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 标记。返回 void 类型
set类型:用于统计集合中关键值出现的次数
set 不支持下标操作符,而且没有定义 mapped_type 类型。
在 set 容器中,value_type 不是 pair 类型,而是与 key_type 相同的类型。
vector<int> ivec;
... //存储 20 个元素:0-9(包括 9)中每个整数都出现了两次。
set<int> iset(ivec.begin(), ivec.end());
cout << ivec.size() << endl; // prints 20
cout << iset.size() << endl; // prints 10
在 set 中添加元素
set<string> set1; // empty set
set1.insert("the"); // set1 now has one element
set1.insert("and"); // set1 now has two elements
与 map 容器的操作一样,带有一个键参数的 insert 版本返回 pair 类型对象,包含一个迭代器和一个 bool 值,迭代器指向拥有该键的元素,而 bool 值表明是否添加了元素。使用迭代器对的 insert 版本返回 void 类型。
multimap 和 multiset 类型
multimap 不支持下标运算,因为在这类容器中,某个键可能对应多个值。
带有一个键参数的 erase 版本将删除拥有该键的所有元素,并返回删除元素的个数。而带有一个或一对迭代器参数的版本只删除指定的元素,并返回 void类型