C++Primer第4版习题解答第十一章.docx
- 文档编号:29863814
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:26
- 大小:127.29KB
C++Primer第4版习题解答第十一章.docx
《C++Primer第4版习题解答第十一章.docx》由会员分享,可在线阅读,更多相关《C++Primer第4版习题解答第十一章.docx(26页珍藏版)》请在冰豆网上搜索。
C++Primer第4版习题解答第十一章
第十一章泛型算法
1.algorithm头文件定义了一个名为count的函数,其功能类似于find。
这个函数使用一对迭代器和一个值做参数,返回这个值出现的次数的统计结果。
编写程序读取一系列int型数据,并将它们存储到vector对象中然后统计某个指定的值出现了多少次。
//11.17_11.1_int_to_vector_count.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include
#include
#include
usingnamespacestd;
int_tmain(intargc,_TCHAR*argv[])
{
cout<<"\tInputsomeintnumbers(ctrl+ztoend):
\n\t";
vector
intiVal;
while(cin>>iVal)
iVec.push_back(iVal);
cout<<"\n\tInputanumtosearchintheiVec:
";
cin.clear();
cin>>iVal;
intiCnt=0;
if(iCnt=count(iVec.begin(),iVec.end(),iVal))
{
cout<<"\n\tThevalue"< } system("pause"); return0; } 2.重复前面的程序,但是,将读入的值存储到一个string类型的list对象中。 //11.17_11.2_list_string_count.cpp: 定义控制台应用程序的入口点。 // #include"stdafx.h" #include #include #include #include usingnamespacestd; int_tmain(intargc,_TCHAR*argv[]) { cout<<"\tInputsomestringsnumbers(ctrl+ztoend): \n\t"; list stringstr; while(cin>>str) strLst.push_back(str); cout<<"\n\tInputastringtosearchinthestrList: "; cin.clear(); cin>>str; size_tiCnt=0; if(iCnt=count(strLst.begin(),strLst.end(),str)) { cout<<"\n\tThestring'"< } system("pause"); return0; } 3.用accumulate统计vector //11.19_11.3_accumulate_vector_int.cpp: 定义控制台应用程序的入口点。 // #include"stdafx.h" #include #include #include #include usingnamespacestd; int_tmain(intargc,_TCHAR*argv[]) { cout<<"\tInputsomeintnumbers(ctrl+ztoend): \n\t"; vector intiVal; while(cin>>iVal) { iVec.push_back(iVal); } cout<<"\n\tInputaintnumforthefirstnum: "; cin.clear(); cin>>iVal; if(iVal=accumulate(iVec.begin(),iVec.end(),iVal)) { cout<<"\n\tThesumofallthemembersandiValis: "< } system("pause"); return0; } 4.假定v是vector 如果有的话,错在哪里? 没有错,accumulate函数必须满足第三个实参的类型与容器内的意思匹配,或者可以转化为第三个实参的类型。 本题中double可以转化为int类型,但是会有较大误差。 5.对于本节调用find_first_of的例程,如果不给it加1,将会如何。 (1)如果存在同时出现在两个list中的名字,则进入while循环,死循环; (2)不存在同时出现在两个list中的名字,循环不会被执行。 6.使用fill_n编写程序,将一系列int型值设为0。 //11.18_11.6_fill_n.cpp: 定义控制台应用程序的入口点。 // #include"stdafx.h" #include #include #include #include usingnamespacestd; int_tmain(intargc,_TCHAR*argv[]) { cout<<"\tInputsomeintnumbers(ctrl+ztoend): \n\t"; vector intiVal; while(cin>>iVal) { iVec.push_back(iVal); } cout<<"\n\tThecontentofivecis: \n"; for(vector : iteratorit=iVec.begin();it! =iVec.end();++it) cout<<*it<<""; fill_n(iVec.begin(),iVec.size(),0); cout<<"\n\tAfterfill_n(),thecontentofivecis: \n"; for(vector : iteratorit=iVec.begin();it! =iVec.end();++it) cout<<*it<<""; cout< system("pause"); return0; } 7.判断下面的程序是否有错,如果有,请改正之: (a)vector while(cin>>i) lst.push_back(i); copy(lst.begin(),lst.end(),vec.begin()); (b)vector vec.reserve(10); fill_n(vec.begin(),10,0); (a)有错,vec是一个空容器,试图往一个空容器里复制数据,发生错误,应改为: copy(lst.begin(),lst.end(),back_inserter(vec)); (b)有错误,虽然为vec分配了内存,但是vec仍然是一个空容器,而在空vec上调用fill_n会产生灾难,更正为: vector vec.resize(10); fill_n(vec.begin(),10,0); 8.前面说过,算法不改变它所操纵的容器的大小,为什么使用back_inserter也不能突破这个限制? 在使用back_inserter是,不是算法直接改变它所操作的容器的大小,而是算法操作迭代器back_inserter,迭代器的行为导致了容器的大小改变。 9.编写程序统计长度不小于4个单词,并输出输入序列中不重复的单词。 在程序源文件上运行和测试你自己的程序。 //11.18_11.9_wc_GT4.cpp: 定义控制台应用程序的入口点。 // #include"stdafx.h" #include #include #include #include #include usingnamespacestd; boolisShorter(conststring&s1,conststring&s2) { returns1.size() } boolGT4(conststring&s) { returns.size()>=4; } stringmake_plural(size_ti,conststring&s1,conststring&s2) { return(i==1)? s1: s1+s2; } int_tmain(intargc,_TCHAR*argv[]) { cout<<"\tInputsomewords(ctrl+ztoend): \n\t"; vector stringstrVal; while(cin>>strVal) strVec.push_back(strVal); //sort sort(strVec.begin(),strVec.end()); vector : iteratorend_unique=unique(strVec.begin(),strVec.end()); strVec.erase(end_unique,strVec.end()); stable_sort(strVec.begin(),strVec.end(),isShorter); vector : size_typewc=count_if(strVec.begin(),strVec.end(),GT4); cout< cout<<"\n\tUniquewords: "< for(vector : iteratorit=strVec.begin();it! =strVec.end();++it) cout<<*it<<""; cout< system("pause"); return0; } 10.标准库定义了一个find_if函数,与find一样,find_if函数带有一对迭代器形参,指定其操作的范围。 与count_if一样,该函数还带有第三个形参,表明用于检查范围内每个元素的谓词函数。 find_if返回一个迭代器,指向第一个使为此函数返回非零值的元素。 如果这样的元素不存在,则返回第二个迭代器实参。 使用find_if函数重写上述例题中统计长度大于6的单词个数的程序部分。 首先创建一个空的map容器m,然后再m中增加一个键为0的元素,并将其值赋值为1, 第二段程序将出现运行时错误,因为v为空的vector对象,其中下标为0的元素不存在。 对于vector容器,不能对尚不存在的元素直接赋值,只能使用push_back、insert等函数增加元素。 intiCnt=0; vector : iteratorwit=strVec.begin(); while((wit=find_if(wit,strVec.end(),GT7))! =strVec.end()) { iCnt++; ++wit; } cout< 11.你认为为什么算法不改变容器的大小? 为了使得算法能够独立于容器,从而普适性更好,真正成为“泛型”算法。 12.为什么必须使用erase,而不是定义一个泛型算法来删除容器中的元素。 泛型算法的原则就是不改变容器的大小。 13.解释三种插入迭代器的区别。 区别在于插入的元素的位置不同: back_inserter,使用push_back实现在容器末端插入。 front_inserter,使用push_front实现在容器前端插入。 inserter,使用insert实现插入,它还带有第二个实参: 指向插入起始位置的迭代器。 14.编程使用replace_copy将一个容器中的序列复制给另一个容器,并将前一个序列中给定的值替换为指定的新值。 分别使用inserter、back_inserter和front_inserter实现这个程序。 讨论在不同情况下输出序列如何变化。 //11.18_11.14_replace_copy.cpp: 定义控制台应用程序的入口点。 // #include"stdafx.h" #include #include #include #include usingnamespacestd; int_tmain(intargc,_TCHAR*argv[]) { //vector intia[]={1,2,3,4,100,5,100}; vector //testingoutiVec cout<<"\n\tThecontentsofiVec: "; for(vector : iteratorit=iVec.begin();it! =iVec.end();++it) cout<<*it<<""; cout< list //copyiVec'smembertoiLst; cout<<"\nUsinginserter: "< replace_copy(iVec.begin(),iVec.end(),inserter(iLst,iLst.begin()),100,0); cout<<"\tThecontentsofiLst: "; for(list : iteratorit=iLst.begin();it! =iLst.end();++it) cout<<*it<<""; cout< cout<<"\nUsingback_inserter: "< iLst.clear(); replace_copy(iVec.begin(),iVec.end(),back_inserter(iLst),100,0); cout<<"\tThecontentsofiLst: "; for(list : iteratorit=iLst.begin();it! =iLst.end();++it) cout<<*it<<""; cout< cout<<"\nUsingfront_inserter: "< iLst.clear(); replace_copy(iVec.begin(),iVec.end(),front_inserter(iLst),100,0); cout<<"\tThecontentsofiLst: "; for(list : iteratorit=iLst.begin();it! =iLst.end();++it) cout<<*it<<""; cout< system("pause"); return0; } 15.算法标准库定义了一个名为unique_copy的函数,其操作与unique类似,唯一的区别在于: 前者接受第三个迭代器实参,用于指定复制不重复元素的目标序列。 编写程序使用unique_copy将一个list对象中不重复的元素复制到一个空的vector对象中。 //11.18_11.15_unique_copy.cpp: 定义控制台应用程序的入口点。 // #include"stdafx.h" #include #include #include #include usingnamespacestd; int_tmain(intargc,_TCHAR*argv[]) { //vector intia[]={1,2,3,4,100,100,5}; list //testingoutiLst cout<<"\n\tThecontentsofiLst: \n\t"; for(list : iteratorit=iLst.begin();it! =iLst.end();++it) cout<<*it<<""; cout< vector //copyiLst'smembertoiVec; cout<<"\nUsingunique_copy,copyiLst'smembertoiVec: "< unique_copy(iLst.begin(),iLst.end(),back_inserter(iVec)); cout<<"\n\tThecontentsofiVec: \n\t"; for(vector : iteratorit=iVec.begin();it! =iVec.end();++it) cout<<*it<<""; cout< system("pause"); return0; } 16.重写(11.3.2节第3小节)的程序,使用copy算法将一个文件的内容写到标准输出中。 //11.20_11.16_iostream_iertator.cpp: 定义控制台应用程序的入口点。 //使用copy算法将一个文件的内容写到标准输出中 #include"stdafx.h" #include #include #include #include #include usingnamespacestd; int_tmain(intargc,_TCHAR*argv[]) { ostream_iterator ifstreaminFile; inFile.open("11.16.txt"); if(! inFile) { cerr<<"errorfile."< return-1; } istream_iterator copy(in_file_iter,eof,out_iter); inFile.close(); cout< system("pause"); return0; } 17.使用一对istream_iterator对象初始化一个int型的vector对象。 //11.20_11.17_istream_iterator_vector.cpp: 定义控制台应用程序的入口点。 // #include"stdafx.h" #include #include #include #include #include usingnamespacestd; int_tmain(intargc,_TCHAR*argv[]) { istream_iterator vector cout<<"\n\tThecontentofiVec: \n\t"; for(vector : iteratorit=iVec.begin();it! =iVec.end();++it) { cout<<*it<<""; } cout< system("pause"); return0; } 18.编程使用istream_iterator对象从标准输入读入一些列整数。 使用ostream_iterator对象将偶数写到第二个文件,每个写入的值都存放在单独的行中。 //11.20_11.18_istream_iterator_ostream_iterator.cpp: 定义控制台应用程序的入口点。 // #include"s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Primer 习题 解答 第十一