《CPrimer》第10章学习笔记_第1页
《CPrimer》第10章学习笔记_第2页
《CPrimer》第10章学习笔记_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+ Primer第10章学习笔记第 1 0章:关联容器关联容器( associative container )支持通过键来高效地查找和读取元素。学习摘录 093:关联容器和顺序容器的本质差别关联容器通过键(key)存储和读取元素;顺序容器则通过元素在容器中的位置顺序存储和访问元素。学习摘录 094:关联容器的主要特点关联容器的独特之处在于支持键的使用。关联容器根据键的次序排。在迭代遍历关联容器时, 我们可以确保按键的顺序访问元素, 而与元素在容器中的存放 位置完全无关。 (与插入顺序也无关)学习摘录 095:关联容器的类型 1. map 关联数组;元素通过键来存储和读取 2. set大小可

2、变的集合,支持通过键实现的快速读取 3. multimap 支持同一个键多次出现的 map 类型 4. multiset 支持同一个键多次出现的 set 类型学习摘录 096:两种基本关联容器的基本特点1. map的元素以键值(key-value )对的形式组织。 附:键,用作元素在 map 的索引。 2. set 仅包含一个键,能有效地支持关于某个键是否存在的查询。学习摘录 097:四种关联容器需要注意的地方 1. set 和 map 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二 个元素。 2. multimap 和 multiset 类型允许多个元素拥有相同的键, 即用于

3、一个键必须对应多个实 例的情况下。 (这两种类型不支持下标运算)第一节: pair 类型 #include <utility>学习摘录 098:pair 的创建与初始化 p a i r<st ri ng, int> elem(“OK”, 1/1h0o);lds a string and an int pair<string, vector<int> > line; / holds string and vector<int>学习摘录 099:pair 对象的操作 pair 类,可直接访问其数据成员:成员都是公有的,分别命名为first

4、 和 second pair< string, int> elem; elem.first =“OK”; elem.second = 3; cout << elem.first << elem.second; / 就这样,就给它们赋值了。学习摘录 100 :生成新的 pair 对象 (make_pair) pair<string, string> next_auth; string first, last; while(cin >> first >> last) / generate a pair from first a

5、nd last next_auth = make_pair(first, last); / process next_auth.第三节: map 类型 #include <map>map 类型通常可理解为“关联数组”通过键获取值,键值相关联。学习摘录 101:键类型的约束 默认情况下标准库使用键类型定义 < 操作符来实现键的比较。 所用的比较函数必须在键类型上定义严格弱排序(strict weak ordering )摘录有想 101 :这也就是说, map<first, second> 中的 first 类型必须支持 < (小于)操作符。学习摘录 102:

6、 map 类定义的类型 map<K, V>:key_type 在 map 容器中,用作索引的键的类型 map<K, V>:mapped_type 在 map 容器中,键所关联的值的类型 map<K, V>:value_type 一个 pair 类型,它的 first 元素具有 key_type 类型, second 元素 具有 mapped_type 类型学习摘录 103:map 类定义类型的访问方法及需要注意的地方当使用了 map<K, V>:value_type 时,该类型中的 key_type 类型是 const 性质,不可修改。 当使用了

7、 map<K, V>:iterator 时,该类型中的 key_type 类型是 const 性质,不可修改。 摘录有想 103 : 即 map<string, int> ok; map<string, int>:value_typevt; map<string, int>:iterator = ok.begin(); vt -> first; 只能读取,不能赋值。iterator -> first 也是只能读取不能赋值。学习摘录 104 :下标在 map 中的行为 假如定义了一个名为 ok 的 map<string, int&

8、gt; 对象 用下标操作 ok “in ” = 会12有以下结果: 当 in 存在,赋 ok -> second 值为 12;当in不存在,新建(即插入)” irS素并赋值为12. 摘录有想 104 :与顺序容器不同的一点是,用下标访问有可能会使 map 容器添加一个新的元素。学习摘录 1 05:map 中常用的 insert 操作 m.insert(make_pair( “ok” , 12); m.insert(map<string, int>:value_type(“ok” , 1);m.inert(map<string, int>: iterator a =

9、 m.begin(), map<string, int>:iterator b=+a );这三种操作,返回的都是 void 类型。学习摘录 106:查找 map 中的元素 m.find(k); 返回迭代器, 存在,返回符合位置的迭代器, 不存在,返回超出末端迭代器。 m.count(k); 返回 m 中 k 的出现次数。摘录有想 106 : count 操作根据 map 的性质,只能回返回 0 或 1.学习摘录 107 :从 map 中删除元素 / erase of a key returns number of element removed if(word_count.eras

10、e(removal_word) ) cout << “ ok: “ << removal_word << “ removedn ”; else cout << “ oops: “ << removal_word << “ not found! n ”; m.erase(k) 删除 m 中键为 k 的元素。返回 size_type 类型的值,表示删除的元素个数。第五节: multimap 和 multiset 类型学习摘录 108: multimap 和 multiset 类型元素的添加 由于键不要求是唯一的,因此每次调用

11、insert 总会添加一个元素。 multimap<string, string> authors; / adds first elemt with key a authors.insert(make_pair( string(“ a” ), string( “ b” ) ); ok: adds second element with key a authors.insert(make_pair(string(“ a” ), string( “ c” ) );学习摘录 109: multimap 和 multiset 类型元素的删除带有一个键参数的 erase 版本将删除拥有该键的

12、 “所有”元素,并返回删除元素的个数。 multimap<string, string> :size_typecnt = authors.erase(“ a” );学习摘录 110: multimap 和 multiset 类型元素的查找第一种方法 直接见实例,当使用 iter 与 find 结合时, iter 能保存所有 find 找到的键的结果。/ author we' ll look forstringsearch_item(“ A” );typedefmultimap<string, string>:size_typesz_type; sz_type e

13、ntries = authors.count(search_item);/ get iterator to the first entry for this author multimap<string, string>: iterator iter = authors.find(search_item);/ loop through the number of entries there are for this author for(sz_typecnt = 0; cnt != entries; +cnt, +iter) cout << iter -> sec

14、ond << end; / print each title 上例中, count 函数求出某键出现次数,而 find 则返回一个迭代器,指向第一个正在查 找的实例。学习摘录 110: multimap 和 multiset 类型元素的查找第二种方法 m.lower_bound(k) 返回一个迭代器,指向键不小于 k 的第一个元素 m.upper_bound(k) 返回一个迭代器,指向键大于 k 的第一个元素/ definitions of authors and search_item as above/ beg and end denote range of elements

15、for this author typedefmultimap<string, string>:iterator authors_it; authors.it beg = authors.lower_bound(search_item); authors.it end = authors.upper_bound(search_item);/ loop through the number of entries there are for this author while( beg != end)cout << beg -> second << end

16、l; / print each title+beg;摘录有想 110 :这里利用了迭代器取得元素在 multimap 中的区间, 能这样操作是因为, 在 multimap 中, 它的元素是以“键”的 < (小于)的顺序排序的学习摘录 111: multimap 和 multiset 类型元素的查找第三种方法 m.equal_range(k) 返回一个迭代器的 pair 对象,它的 first 成员等价于 m.lower_bound(k) , 它的 second 成员等价于 m.upper_bound(k);直接见实例: typedefmultimap<string, string&

17、gt;:iterator authors_it;/ definitions of authors and search_item as above/ pos holds iterators that denote range of elements for this key pair<authors_it, authors_it> pos = authors.equal_range(search_item);/ loop through the number of entries there are for this author while(pos.first != pos.second)co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论