练习9.18:编写程序,从标准输入读取string序列,存入一个deque中。编写一个循环,用迭代器打印deque中的元素。
解答:
#include<iostream>
#include<deque>
#include<string>
using std::string;using std::deque;using std::endl;using std::cin;using std::cout;
int main()
{
string str;
deque<string> sde;
while(cin>>str)
sde.push_back(str);
for(auto &s:sde)
cout<<s<<" ";
cout<<endl;
return 0;
}
练习9.19:重写上题的程序,用list代替deque。列出程序要做出哪些改变。
解答:
把deque替换为list即可。
#include<iostream>
#include<list>
#include<string>
using std::string;using std::list;using std::endl;using std::cin;using std::cout;
int main()
{
string str;
list<string> sde;
while(cin>>str)
sde.push_back(str);
for(auto &s:sde)
cout<<s<<" ";
cout<<endl;
return 0;
}
练习9.20:编写程序,从一个list<int>拷贝元素到两个deque中。值为偶数的所有元素拷贝到一个deque中,而奇数值元素都拷贝到另一个deque中。
解答:
#include<iostream>
#include<list>
#include<deque>
using std::deque;using std::list;using std::endl;using std::cin;using std::cout;
int main()
{
list<int> sde{1,2,3,4,5,6};
deque<int> d1,d2;
for(const auto &s:sde)
{
if(s%2==0)
d1.push_back(s);
else
d2.push_back(s);
}
for(auto &i1:d1)
cout<<i1<<" ";
cout<<endl;
for(auto &i2:d2)
cout<<i2<<" ";
cout<<endl;
return 0;
}
练习9.21:如果我们将第308页中使用insert返回值将元素添加到list中的循环程序改写为将元素插入到vector中,分析循环将如何工作。
解答:
插入第一个读取的字符串,并把它插入到ITER前。返回的值是指向新元素的迭代器;阅读的另一个词。只要有文字的插入,每次通过同时插入一个新的元素在ITER之前,重置iter新插入的元素的位置。该元素是第一个元素(新)。因此,每一次迭代中插入一个元素在为vector中的第一个元素。
练习9.22:假定iv是一个int的vector,下面的程序存在什么错误?你将如何修改?
vector<int>::iterator iter = iv.begin(),mid = iv.begin()+iv.size()/2;
while(iter != mid)
if(*iter == some_val)
iv.insert(iter, 2*some_val);
修改:
#include<iostream>
#include<vector>
#include<iterator>
using std::iterator;using std::vector;using std::endl;using std::cout;
int main()
{
vector<int> iv{1,2,3,4,5,6,7,8,9,10};
iv.reserve(25);
vector<int>::iterator iter = iv.begin(),
mid = iv.begin()+iv.size()/2;
while(iter!=mid)
if(*mid == 5)
mid = iv.insert(iter, 2*5);
else
--mid;
return 0;
}
练习9.23:在本节第一个程序(309页)中,若c.size()为1,则val、val2、val3和val4的值会是什么?
解答:
这四个元素的值与第一个元素的值相等。
练习9.24:编写程序,分别用at、下标运算符、front和begin提取一个vector中的第一个元素。在一个空vector上测试你的程序。
解答:
#include<iostream>
#include<vector>
using std::vector;using std::endl;using std::cout;
int main()
{
vector<int> iv;
cout<<iv.at(0)<<endl; // terminating with uncaught exception of type std::out_of_range
cout<<iv[0]<<endl; // Segmentation fault: 11
cout<<iv.front()<<endl; // Segmentation fault: 11
cout<<*iv.begin()<<endl; // Segmentation fault: 11
return 0;
}
练习9.25:对于312页中删除一个范围内的元素的程序,如果elem1与elem2相等会发生什么?如果elem2是尾后迭代器,或者elem1和elem2皆为尾后迭代器,又会发生什么?
解答:
如果elem1与elem2相等,什么也不会发生;如果elem2是尾后迭代器,则输出elem1到最后的所有元素;如果elem1和elem2皆为尾后迭代器,什么都不会发生。
练习9.26:使用下面代码定义的ia,将ia拷贝到一个vector和一个list中。使用单迭代版本的erase从list中删除奇数元素,从vector中删除偶数元素。
int iain[] = {0,1,1,2,3,5,8,13,21,55,89};
解答:
#include<iostream>
#include<list>
#include<vector>
using std::list;using std::vector;using std::endl;using std::cout;using std::end;
int main()
{
int ia[] = {0,1,1,2,3,5,8,13,21,55,89};
vector<int> ivec(ia,end(ia));
list<int> ilist(ivec.begin(),ivec.end());
for(auto it = ilist.begin(); it != ilist.end(); )
if(*it & 0x1)
it = ilist.erase(it);
else
++it;
for(auto it = ivec.begin(); it != ivec.end(); )
if(*it %2 == 0)
it = ivec.erase(it);
else
++it;
cout<<"list: "<<endl;
for(auto i:ilist)
cout<<i<<" ";
cout<<endl;
cout<<"vector: "<<endl;
for(auto i:ivec)
cout<<i<<" ";
cout<<endl;
return 0;
}