【C++ Primer 学习笔记】 chapter 10 关联容器

来源:互联网 发布:php api 上传图片 编辑:程序博客网 时间:2024/06/12 23:22

chapter10 关联容器

关联容器类型
map 关联数组:元素通过键来存储和读取
set 大小可变的集合,支持通过键实现的快速读取
multimap 支持同一个键多次出现的map类型
multiset 支持同一个键多次出现的set类型

 

10.1 pair类型


1)至少可以使用三种方法创建pair对象“
1> 在定义pair对象时提供初始化式从而创建pair对象:
   pair<string, int> sipr(str,ival);
2> 直接访问pair对象的数据成员从而生成pair对象”
   pair<string,int> sipr;
   sipr.first = str;
   sipr.second = ival;
3> 使用make_pair函数生成pair对象。
   sipr = make_pair(str,ival);


10.2 关联容器


1)关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
2)关联容器不提供front、push_front、back、push_back、pop_front 、pop_back操作;
3)举例说明list,vector,deque,map以及set类型分别适用的情况
   list类型适用于需要在容器的中间位置插入和删除的情况。例如,以无序的方式读入一系列学生数据,并按学号顺序存储。
   vector类型适用于需要随机访问元素的情况。例如,在序号为1...2.d的一系列人员中,访问第k个人的信息。
   deque类型适用于需要在容器的尾部或首部插入和删除元素的情况。例如,对服务窗口进行管理,先来的顾客先得到服务。
   map类型适用于需要键-值对的集合的情况。例如,字典、电话薄的建立和使用。
   set类型适用于需要使用键集合的情况。例如,黑名单的建立和使用。

 

10.3 map类型


1)所有的比较函数必须在键类型上定义严格弱排序;
2)在实际应用中,键类型必须定义<操作符,而且该操作符应能“正确地工作”;
3)value_type是pair类型,它的值成员可以修改但是键成员不能修改;
4)使用下标访问map中不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标的值;
5)map容器和set容器一样,存储的键必须唯一,而且不能修改(键的类型均为const);
6)使用下标操作的程序简洁,更容易编写和阅读,而insert函数的返回值的使用比较复杂。但使用insert函数可以避免使用下标操作带来的副作用,即避免对新插入元素的不必要的值初始化,而且可以显示第表示元素的插入(下标操作是隐式表示元素的插入),有其优点。
7)map容器的count返回map容器中给定键k的出现次数,其返回值只能是-或1,count适合于解决判断map容器中某键是否存在的问题。find运算在map容器中存在按给定键k索引的元素的情况下,返回指向该元素的迭代器,否则返回超出末端迭代器。find使用于解决在map容器中查找指定键对应的元素的问题。
8)可以使用map类型的应用如下:
 a)字典:map对象定义为map<string,string> dictionary;
 b)电话薄:  map<string,string> telBook;
 c)商品价目表: map<string, float> priceList;
可以使用下标操作符或insert函数插入元素,使用find函数读取元素。

 

10.4 set 类型


1)map容器和set容器的差别在于:map容器是键-值对的集合,而set容器只是键的集合;map类型适用于需要了解键与值的对应的情况,例如,字典(单词(键),解释(值)),而set类型适用于只需判断某值是否存在的情况,例如,判断某人的名字是否在黑名单中。
2)set容器和list容器的差别在于:set容器中的元素不能修改,而list容器中的元素无此限制;set容器适用于保存元素值不变的集合,而list容器适用于保存会发生变化的元素。

 

10.5multimap 和multiset类型


1)multimap不支持下标运算

 

10.6 容器的综合运用:文本查询程序


使用vector容器代替set对象来存储行号,优缺点?
使用vector,在进行行号的插入时,为了不存储重复的行号,需要判断该行号是否已在容器中,再决定是否插入;而使用set容器存储行号,则可以使用set容器所提供的insert函数的特点(如果元素已存在,insert函数不进行操作),无需判断行号是否已存在,直接利用insert函数插入元素即可,性能相对较高。
从设计上看,vector容器的特点是特别适用于需要随机访问元素的情况。而此处对于存储的行号,不需要进行随机访问(只需顺序访问),因而未能充分体现vector容器的有点。而set容器因其插入操作的简单使得设计更为简洁。因此,此处用set容器更好。

 

Notices:
在头文件中,必须总是使用完全限定的标准库名字,例如std::限定符而不是使用using namespace std;

 

 

原创粉丝点击