C++primer U10 读书笔记 关联容器

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类型


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值