C++Primer 第9章-顺序容器-课后习题答案 下载本文

第9章 顺序容器

1.解释下列初始化,指出哪些是错误的,为什么? int ia[7] = { 0, 1, 1, 2, 3, 5, 8 }; string sa[6] = { “Fort Sunter”, “Manassas”, “Perryville”, “ Vicksburg”, “Meridian”, “Chancellorsville” }; (a) vector svec( sa, sa+6 ); (b) list ilist( ia + 4, ia + 6 ); (c) vector ivec( ia, ia + 8 ); (d) list slist ( sa + 6, sa );

(c) 错误,初始化迭代器的终止指针访问数组越界。

(d) 错误,初始化容器的迭代器起始点和终止点指定错误,顺序反了。

2.创建和初始化一个vector对象有4种方式,为每种方式提供一个例子,并解释每个例子生成的vector对象包含什么值。 int ia[3] = { 1, 2, 3 };

(1) vector ivec1( 3 ); // 默认初始化, 内容为3个0

(2) vector ivec2( ia, ia+3); // 把数组ia里的值复制到 ivec2中 (3) vector ivec3 ( ivec2 ); // 用ivec2来初始化 ivec3 (4) vector ivec4 ( 3, 6 ); // 将ivec4初始化为3个6

3.解释复制容器对象的构造函数和使用两个迭代器的构造函数之间的差别。 前者的构造函数将一个对象的全部元素复制到另一个容器对象里,而且要求两个对象的类型和元素的类型都相同;

后者可以将一个容器初始化为另一个容器的子序列,而且不要求两个容器的类型是同类型的。

4.定义一个list对象来存储deque对象,该对象存放int 类型的元素。 list< deque > ilist;

5.为什么我们不可以使用容器来存储iostream对象?

因为iostream对象不支持复制和赋值操作。

6.假设有一个名为Foo的类,这个类没有定义默认构造函数,但提供了需要一个int型参数的构造函数。定义一个存放Foo的list对象,该对象有10个元素。 list Flist( 10, 1 );

7.下面的程序错在哪里?如何改正? list lst1;

list::iterator iter1 = lst1.begin(), iter2 = lst1.end();

while ( iter1 < iter2 ) /*…*/

错在while循环里的条件表达式 中 使用了< 操作符,因为list容器的迭代器不支持关系操作符,可改为 iter1 != iter2

8.假设vec_iter 绑定到vector对象的一个元素,该vector对象存放string类型的元素,请问下面的语句实现什么功能? it ( vec_iter->empty() ) //…

判断vec_iter所指向的vector元素是否为空字符串。

9.编写一个循环将list容器的元素逆序输出。 list ilist( 10, 1 );

list::iterator it = ilist. end(); --it;

for ( ; it != ilist.begin(); --it ) cout << *it << endl;

10.下列迭代器的用法哪些是错误的? const vector< int > ivec ( 10 ); vector < string > svec ( 10 ); list< int > ilist( 10 );

(a) vector::iterator it = ivec.begin(); (b) list::iterator it = ilist.begin() + 2; (c) vector::iterator it = &svec[0];

(d) for ( vector::iterator it = svec.begin(); it != 0; ++it ) //…

(b)错误,list的迭代器不支持算术运算。 (a) 错,ivec.begin() 返回的是const vector的迭代器,不能用来初始化vector的迭代器。

(c) 错误,迭代器不支持用&操作符来初始化。 (d) 错误,it与0进行比较会产生运行时错误。

11.要标记出有效的迭代器范围,迭代器需满足什么约束?

first和last须指向同一个容器中的元素或超出末端的下一位置。last不能位于first之前。

12.编写一个函数,其形参是一对迭代器和一个int型数值,实现在迭代器标记的范围内寻找该int型数值的功能,并返回一个bool结果,以指明是否找到指定数据。 // 11.15_9.12_iterator_Function.cpp : 定义控制台应用程序的入口点。

//

#include \#include #include #include using namespace std;

typedef vector::iterator iter; bool findTheInt( iter first, iter last, int x ) { assert( first <= last ); if ( first > last ) cout << \ << endl; for ( iter it = first; it != last; ++it ) { if ( *it == x ) return true; } return false; }

int _tmain(int argc, _TCHAR* argv[]) { int ia[] = { 0, 1, 2, 3, 4, 5 }; vector ivec( ia, ia+5 ); bool find3 = false; find3 = findTheInt( ivec.begin(), ivec.end(), 3 ); if ( find3 ) { cout << \ << endl; } else cout << \ << endl; system(\); return 0; }