练习9.1:对于下面的程序任务,vector、deque和list哪种容器最为适合?解释你的选择的理由。如果没有哪种容器优于其他容器,也请解释理由。
(a)读取固定数量的单词,将它们按字典序插入到容器中。我们将在下一章中看到,关联容器更适合这个问题。
(b)读取未知数量的单词,总是将新单词插入到末尾。删除操作在头部进行。
(c)从一个文件读取未知数量的整数。将这些数排序,然后将它们打印到标准输出。
解答:
(a)关联容器是最好的选择;在这里,我们可以选择vector或者deque,比选择list好。因为我们不需要在容器中间插入或者删除元素。
(b)选择deque;如果程序是需要在头部或者尾部而不是中间插入或删除元素,就用deque。
(c)选择vector;因为不需要在头部或者尾部插入或删除元素,如果你的程序有很多小元素和较大的空间开销,不要使用forward_list或者list。
练习9.2:定义一个list对象,其元素类型是int的deque。
解答:
std::list<std::deque<int>> ldi;
练习9.3:构成迭代器范围的迭代器有何限制?
解答:
有两个迭代器begin和end;它们指向同一个容器中的元素,我们可以通过反复递增begin来到达end。
练习9.4:编写函数,接受一对指向vector<int>的迭代器和一个int值。在两个迭代器指定的范围中查找给定的值,返回一个布尔值来指出是否找到。
解答:
bool findNum(std::vector<int>::iterator beg,std::vector<int>::iterator end,int num)
{
for(auto itr=beg; itr!=end; ++itr)
if(*itr==num)
return true;
return false;
}
练习9.5:重写上一题函数,返回一个迭代器指向所找到的元素。注意,程序必须处理未找到给定值的情况。
解答:
std:vector<int>:iterator findNum(std::vector<int>::iterator beg,std::vector<int>::iterator end,int num)
{
for(auto itr=beg; itr!=end; ++itr)
if(*itr==num)
return itr;
return end;
}
练习9.6:下面程序有何错误?你应该如何修改它?
list<int> lst1;
list<int>::iterator iter1 = lst1.begin(),
iter2 = lst1.end();
while(iter1<iter2) /* ... */
解答:
运算符“<”不能用于list,应该改为while(iter1 != iter2)。