- 注册时间
- 2011-1-27
- 最后登录
- 2021-8-19
- 在线时间
- 229 小时
终身VIP会员
花钱是让你服务的,不是叫你大哥 ...
- 魔鬼币
- 10632
|
楼主 |
发表于 2011-5-4 13:18:13
|
显示全部楼层
习题9.1
解释下列初始化,指出哪些是错误的,为什么?
int ia[7]={0,1,1,2,3,5,8};
string sa[6]={“fort sumter”,”manassas”,”Perryville”,”Vicksburg”,”merdian”,”Chancellorsville”};
(a). vector<string>svec(sa,sa+6); 正确
(b). list<int>ilist(ia+4, ia+6); 正确
(c). vector<int>ivec(ia, ia+8); 正确
(d). list<string>slist(sa+6,sa); 正确
习题9.2
创建和初始化一个vector对象有四种方式,为每种方式提供一个例子,并解释每个例子生成的vector对象包含什么值。
1. vector<int>ivec;
vector<int>ivec2(ivec); //用一个容器初始化为另一个容器的副本;
容器ivec2对象中包含了容器ivec中的所有元素;
2. vector<string>::iterator mid=svec.begin()+svec.size()/2; //初始化为一段元素的副本;
3. vector<int>ivec(64,2); //分配和初始化指定书目的元素;
4. 略。
习题9.3
解释复制容器对象的构造函数和使用两个迭代器的构造函数之间的差别。
略。
习题9.4
定义一个list对象来存储deque对象里的元素,该deque对象存放int型元素。
list< deque<int> > ilists;
习题9.5
为什么我们不可以使用容器来存储iostream对象?
习题9.6
假设有一个名为Foo的类,这个类没有定义默认构造函数,但提供了需要一个int型参数的构造函数,定义一个存放Foo的list对象,该对象有10个元素。
list<Foo> ok(10,1);
习题9.7
下面的程序错在哪里?如何改正?
list<int> lst1;
list<int>::iterator iter1=lst1.begin();
iter2=lst1.end();
while(iter1<iter2) /*…………*/
第一个错误,首先初始化iter2之前要加上list<int>::iterator;
第二个错误,list容器的迭代器不支持关系运算。
习题9.8
假设vec_iter与vector对象的一个元素捆绑在一起,该vector对象存放string类型的元素,请问下面的语句实现什么功能?
if (vec_iter->empty())/*…………*/
判断字符串是否为空。
习题9.9
编写一个循环将list容器的元素逆序输出。
list<int> ilist;
for(list<int>::iterator iter1=ilist.end();iter1!=ilist.begin();--iter1)
cout<<*iter1;
习题9.10
系列迭代器的用法哪些(如果有的话)是错误的?
const vector<int>ivec(10);
vector <string> sevc(10);
list<int> ilist(10);
vector <int>::iterator iter=ivec.begin(); //WRONG
list<int>::iterator iter=ilist.begin(); //RIGHT
vector<string>::iterator it=&svec[0]; //WRONG
for (vector<string>::iterator it=sevc.begin();it!=0;++it) //RIGHT
习题9.11
要标记出有效的迭代器范围,迭代器需满足什么约束?
答:它们指向同一个容器中的元素或超出末端的下一位置。
如果这两个迭代器不相等,则对first反复做自增运算必须能够到达last。换句话说,在容器中,last绝对不能位于first之前。
习题9.12
编写一个函数,其形参是一对迭代器和一个int型数值,实现在迭代器标记范围内寻找该int型数值的功能,并返回一个bool结,以指明是否找到指定数据。
bool func(vector<int>,int);
int main()
{
int sarray[5]={1,2,3,4,5};
vector<int> ivec1(sarray,sarray+4);
cout<<func(ivec1,2);
return 0;
}
bool func(vector<int> ivec2,int x)
{
for(vector<int>::iterator iter=ivec2.begin();iter!=ivec2.end();++iter)
if(*iter==x){return true;break;}
return false;
}
习题9.13
重写程序,查找元素的值,并返回指向找到的元素的迭代器。确保程序在要寻找的元素不存在时也能工作。
int main()
{
int sarray[5]={1,2,3,4,5};
vector<int> ivec1(sarray,sarray+4);
cout<<func(ivec1,6);
return 0;
}
bool func(vector<int> ivec2,int x)
{
for(vector<int>::iterator iter=ivec2.begin();iter!=ivec2.end();++iter)
if(*iter==x){return iter;break;}
return false;
习题9.14
使用迭代器编写程序,从标准输入设备读入若干string对象,并将它们存储在一个vector对象中,然后输出该vector对象中的所有元素。
习题9.15
用list容器类型重写习题9.14得到的程序,列出改变了容器类型后要做的修改。
习题9.16
int型的vector容器应该使用什么类型的索引?
Iterator
习题9.17
读取存放string对象的list容器时,应该使用什么类型?
const_iterator
习题9.18
编写程序将int型的list容器的所有元素复制到两个deque容器中。List容器的元素如果为偶数,则复制到一个deque容器中;如果为奇数,则复制到另一个deque容器里。
int ia[10]={1,2,3,4,5,6,7,8,9,10};
list<int> ilist(ia,ia+10);
list<int>::iterator first=ilist.begin();
deque<int> ideq1;
deque<int> ideq2;
for(;first!=ilist.end();++first)
if(*first%2==0)
{ideq1.push_front(*first);}
else ideq2.push_front(*first);
return 0;
习题9.19
假设iv是一个int型的vector容器,下列程序存在什么错误?如何改正之。
习题9.20
编写程序判断一个vector<int>容器所包含的元素是否与一个list<int>容器所包含的元素完全相同。
习题9.21
假设c1和c2都是容器,下列用法给c1和c2的元素类型带来什么约束?
If(c1<c2)
(如果有的话)对c1和c2的约束又是什么?
答: 要实现两个容器的比较,比较的容器必须具有相同的容器类型,而且其元素类型也必须相同。
习题9.22
已知容器vec存放了25个元素,那么vec.resize(100)操作实现了什么功能?若再做操作vec.resize(10),实现的又是什么功能?
答: 在容器vec的尾部增加75个值为0的元素,然后将容器vec的后90个元素擦除掉,将容器vec的大小调整为10.
习题9.23
使用只带有一个长度参数的resize操作对元素类型有什么要求?(如果有的话)
习题9.24
编写程序获取vector容器的第一个元素。分别使用下标操作符、front函数以及begin函数实现该功能,并提供空的vector容器测试你的程序。
vector <int> ivec(0);
vector<int>::iterator iter1=ivec.begin();
vector<int>::iterator iter2=&ivec.front();
cout<<*iter1<<endl;
cout<<ivec[0]<<endl;
cout<<ivec.at(0)<<endl;
最后导致程序崩溃出错。
习题9.25
需要删除一段元素时,如果val1与val2相等,那么程序会发生什么事情?如果val1和val2中的一个不存在,或两个都不存在,程序又会怎么样?
答:如果val1和val2相等,那么删除指向第一个val1开始到指向val2之间的所有元素,包括val1,但不包括val2.
如果val1不存在,val2存在,那么elem指向容器最后一个元素的下一个位置。
如果val1存在,val2不存在,那么删除指向val1开始到容器末尾的所有元素。
如果val1和val2都不存在,那么elem指向容器最后一个元素的下一个位置,并且不删除任何容器内的元素。
习题9.26
假设有如下ia的定义,将ia复制到一个vector容器和一个list容器中。使用单个迭代器参数版本的erase函数将list容器中的奇数值元素删除掉,然后将vector容器中的偶数值元素删除掉。
int ia[]={0,1,1,2,3,5,8,12,21,55,89};
习题9.27
编写程序处理一个string类型的list容器。在该容器中寻找一个特殊值,如果找到,则将它删除掉。用deque容器重写上述程序。
list<string> slist;
list<string>::iterator elem;
elem1=find(slist.begin(),slist.end(),val1);
if(elem1!=slist.end())
slist.erase(elem);
习题9.28
编写程序将一个list容器的所有元素赋值给一个vector容器,其中list容器中存储的是指向C风格字符串的char*指针,而vector容器的元素则是string类型。
习题9.29
解释vector的容量和长度之间的区别。为什么在连续存储元素的容器中需要支持”容量”的概念?而非连续的容器,如list,则不需要。
长度指容器当前拥有的元素个数,而容量则指容器在必须分配新存储空间之前可以存储的元素总数。举个例子,容器的长度好比是一个储蓄罐中硬币的数量,而容器的容量可以看做是这个储蓄罐可以存放的硬币的数量。
List容器,在每添加一个新元素的时候,标准库将新元素连接到已存在的链表中,不需要重新分配存储空间。
习题9.30
编写程序研究标准库为vector对象提供的内存分配策略。
vector<int> ivec;
cout<<"ivec.size:"<<ivec.size()<<endl;
cout<<"icapacity:"<<ivec.capacity()<<endl;
vector<int> iivec(10,10);
iivec.reserve(20);
cout<<"iivec.size:"<<iivec.size()<<endl;
cout<<"iicapacity:"<<iivec.capacity()<<endl;
while(iivec.size()!=iivec.capacity())
iivec.push_back(0);
cout<<"iivec.size:"<<iivec.size()<<endl;
cout<<"iicapacity:"<<iivec.capacity()<<endl;
iivec.push_back(0);
cout<<"iivec.size:"<<iivec.size()<<endl;
cout<<"iicapacity:"<<iivec.capacity()<<endl;
分别输出0,0,10,20,20,20,21,40。
习题9.31
容器的容量可以比其长度小吗?在初始时或插入元素后,容量是否恰好等于所需要的长度?为什么?
答: 不可以。不一定。当容器为空的时候,插入第一个元素的后,容量和长度都为1,当容器容量为1的时候,插入一个元素,容量和长度都为2,当容器容量为2的时候,插入一个元素,容量为4,长度为3;
习题9.32
解释下面程序实现的功能:
vector<string> svec;
svec.reserve(1024);
string text_word;
while(cin>>text_word)
svec.push_back(text_word);
svec.resize(svec.size()+svec.size()/2);
cout<<svec.size()<<endl;
cout<<svec.capacity()<<endl;
如果该程序读入了256个单词,在调整大小后,该容器的大小为484.容量为1024.
如果读入512,在调整大小后,该容器的大小为768.容量为1024.
如果读入1000,容器的大小为1500.容器的大小为2000. |
|