C++primer练习10.26-10.37
练习10.26
解释三种迭代器的不同之处
::back_inserter创建一个调用push_back的迭代器,不会打乱原有元素的顺序,inserter创建一个调用insert的迭代器,不会打乱插入位置之前包括插入位置的元素的顺序,
front_inserter创建一个调用push_front的迭代器,会把元素插入到当前位置之前,等于是取代了原有位置的元素,并让其及其后面都后移;对容器调用这些特殊迭代器必须符合其
本身支持的情况
练习10.27
除了unique之外,标准库还定义了名为unique_copy的函数,它接受第三个迭代器,表示拷贝不重复元素的目的位置。编写一个程序,使用unique_copy将一个vector中不重复的元素拷贝到一个初始为空的list中
#include<list> int main() { vector<int> a{1,2,3,4,5,6,6}; list<int> b; unique_copy(a.begin(),a.end(),back_inserter(b)); for(auto d:b) cout<<d<<endl; }
练习10.28
一个vector中保存1到9,将其拷贝到三个其它容器中,分别使用inserter、back_inserter和front_inserter将元素添加到三个容器中。对每种inserter,估计输出序列是怎样的,运行程序验证你的估计是否正确
::inserter和back_inserter是1到9,front_inserter是9到1
#include<list> int main() { vector<int> a{1,2,3,4,5,6,7,8,9}; list<int> b,c,d; copy(a.begin(),a.end(),front_inserter(b)); copy(a.begin(),a.end(),inserter(c,c.end())); copy(a.begin(),a.end(),back_inserter(d)); for(auto e:b) cout<<e<<endl; for(auto e:c) cout<<e<<endl; for(auto e:d) cout<<e<<endl; }
练习10.29
编写程序,使用流迭代器读取一个文本文件,存入一个vector中的string里
int main() { ifstream fin("word.txt"); istream_iterator<string> filet(fin); vector<string> a; a.push_back(*filet); for(auto d:a) cout<<d<<endl; }
练习10.30
使用流迭代器、sort和copy从标准输入读取一个整数序列,将其排序,并将结果写到标准输出
int main() { istream_iterator<int> in(cin),eof; ostream_iterator<int> ot(cout,"wa"); vector<int> a(in,eof); sort(a.begin(),a.end()); copy(a.begin(),a.end(),ot); cout<<endl; }
练习10.31
修改前一题的程序,使其只打印不重复的元素。你的程序应使用unique_copy
int main() { istream_iterator<int> in(cin),eof; ostream_iterator<int> ot(cout,"wa"); vector<int> a(in,eof); sort(a.begin(),a.end()); unique_copy(a.begin(),a.end(),ot); cout<<endl; }
练习10.32
重写书店程序,使用一个vector保存交易记录,使用不同算法完成处理。使用sort和compareisbn函数来排序交易记录,然后使用find和accumulate求和
int main() { istream_iterator<Sales_item> in(cin),eof; vector<Sales_item> a(in,eof); sort(a.begin(),a.end(),compareIsbn); Sales_item sum; for(auto d=a.begin();d!=a.end();++d) { auto wc=find(d,a.end,d.isbn) if(wc==a.end()) { cout << sum->isbn() << " " << sum->sale() << endl; sum=*d; } else { sum+=accumulate(d,d+2,0); } } }
练习10.33
编写程序,接受三个参数:一个输入文件和两个输出文件的文件名。输入文件保存的应该是整数。使用istream_iterator读取输入文件。使用ostream_iterator将奇数写入第一个输出文件
,每个值后面跟一空格。将偶数写入第二个输出文件,每个值都独占一行。
void classical(ifstream& infile,ofstream& outfile1, ofstream& outfile2) { istream_iterator<int> in(infile),eof; ostream_iterator<int> ot1(outfile1),ot2(outfile2); vector<int> a(in,eof); copy_if(a.begin(),a.end(),ot1,[](int i){return i%2!=0; }); copy_if(a.begin(),a.end(),ot2,[](int i){return i%2==0; }); } int main() { ifstream infile("number.txt"); ofstream outfile1("file1.txt"); ofstream outfile2("file2.txt"); classical(infile, outfile1, outfile2); }
练习10.34
使用reverse——iterator逆序打印一个vector
int main() { vector<int> a{1,2,3,4,5,6,7,8,9}; ostream_iterator<int> ot(cout); copy(a.rbegin(),a.rend(),ot); cout<<endl; }
练习10.35
使用普通迭代器逆序打印一个vector
int main() { vector<int> a{1,2,3,4,5,6,7,8,9}; ostream_iterator<int> ot(cout); auto d=--a.end(); for(;d!=a.rend().base();--d) cout<<*d; cout<<*d<<endl; }
练习10.36
使用find在一个int的list中查找最后一个值为0的元素
int main() { list<int> a{1,2,3,4,5,6,7,1,9}; ostream_iterator<int> ot(cout); auto d=find(a.rbegin(),a.rend(),1); }
练习10.37
给定一个包含10个元素的vector,将位置3到7之间的元素按逆序拷贝到一个list中
int main() { vector<int> a{1,2,3,4,5,6,7,1,9,10}; list<int> b; copy(a.rend()+3,a.rend()-2,b.begin()); }

浙公网安备 33010602011771号