第10章 关联容器
【72】10.3描述关联容器和顺序容器的差别
答:关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
【73】10.6可否定义一个map对象以vector<int>::iterator为键关联int型对象?如果以list<int>::iterator关联int型对象呢?或者,以pair<int,string>关联int?对于每种情况,如果不允许,请解释其原因。
答:可以定义map对象以vector<int>::iterator和pair<int,string>为键关联int型对象。
不能定义map对象以list<int>::iterator为键关联int型对象。因为键类型必须支持<操作,而list容器的迭代器类型不支持<操作。
【74】10.7对于以int型对象为索引关联vector<int>型对象的map容器,它的mapped_type、key_type和value_type分别是什么?
答:分别是,vector<int>、int和pair< const int,vector<int> >
【75】10.8编写一个表达式,使用map的迭代器给其元素赋值。
答:假设map的迭代器为iter,要赋给元素的值为val,则可以用iter->second=val;语句给map的元素赋值。(注意,键是不能修改的,所以只能给值成员赋值。)
【76】10.10解释下面程序的功能:
map<int,int> m;
m[0]=1;
比较上一程序和下面程序的行为:
vector<int> v;
v[0]=1;
答:程序段map<int,int> m; m[0]=1; 的功能是:首先创建一个空map容器m,然后在m中增加一个键为0的元素,并将其赋值为1.而程序段vector<int> v; v[0]=1;将出现运行时错误。因为vector容器v为空,其中下标为0的元素并不存在。
【77】10.11哪些类型可用作map容器对象的下标?下标操作符返回的又是什么类型?给出一个具体例子说明,即定义一个map对象,指出哪些类型可用作其下标,以及下标操作符返回的类型。
答:可用作map容器对象的下标的类型必须是支持<操作的类型;
下标操作符返回的类型为map容器中定义的mapped_type类型。例如,对于如下定义的对象:
map<string,int> wordCount;
可用作其下标的类型为string以及C风格的字符串类型(包括字面值、数组名和指针)。下标操作符返回的类型为int;
【78】10.14map容器的count和find运算有何区别?
答:前者返回map容器中给定键k的出现次数,其返回值只能是0或1;后者在map容器中存在按给定键k索引的元素的情况下,返回指向该元素的迭代器,否则返回超出末端迭代器。
【79】10.21解释map和set容器的差别,以及它们各自适用的情况。
答:map容器和set容器的差别在于:map容器是键值对的集合,而set容器只是键的集合;map类型适用于需要了解键与值的对应的情况,例如字典,而set类型适用于只需要判断某值是否存在的情况,例如判断某人的名字是否在黑名单中。
【80】10.22解释set和list容器的差别,以及它们各自适用的情况。
答:set容器和list容器的主要差别在于:set容器中的元素不能修改,而list容器中的元素无此限制。set容器适用于保存元素值不变的集合,而list容器适用于保存会发生变化的元素。