C++Primer 第11章-泛型算法-课后习题答案.doc

上传人:豆**** 文档编号:33470054 上传时间:2022-08-11 格式:DOC 页数:22 大小:293.50KB
返回 下载 相关 举报
C++Primer 第11章-泛型算法-课后习题答案.doc_第1页
第1页 / 共22页
C++Primer 第11章-泛型算法-课后习题答案.doc_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《C++Primer 第11章-泛型算法-课后习题答案.doc》由会员分享,可在线阅读,更多相关《C++Primer 第11章-泛型算法-课后习题答案.doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、-作者xxxx-日期xxxxC+Primer 第11章-泛型算法-课后习题答案【精品文档】第11章-泛型算法1.algorithm头文件定义了一个名为count的函数,其功能类似于find。这个函数使用一对迭代器和一个值做参数,返回这个值出现的次数的统计结果。编写程序读取一系列int型数据,并将它们存储到vector对象中然后统计某个指定的值出现了多少次。/ 11.17_11.1_int_to_vector_count.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include using namespace std;int

2、 _tmain(int argc, _TCHAR* argv)cout tInput some int numbers ( ctrl + z to end):nt ;vector iVec;int iVal;while ( cin iVal )iVec.push_back( iVal );cout iVal; int iCnt = 0;if ( iCnt = count( iVec.begin(), iVec.end(), iVal )cout ntThe value iVal occurs iCnt times. endl;system(pause);return 0;2.重复前面的程序,但

3、是,将读入的值存储到一个string类型的list对象中。/ 11.17_11.2_list_string_count.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)cout tInput some strings numbers ( ctrl + z to end):nt ;list strLst;string str;while ( cin str )strLst.push_back

4、( str );cout str;size_t iCnt = 0;if ( iCnt = count( strLst.begin(), strLst.end(), str)cout ntThe string str occurs iCnt times. endl;system(pause);return 0;3.用accumulate统计vector容器对象中的元素之和。/ 11.19_11.3_accumulate_vector_int.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include #include usin

5、g namespace std;int _tmain(int argc, _TCHAR* argv)cout tInput some int numbers ( ctrl + z to end):nt ;vector iVec;int iVal;while ( cin iVal )iVec.push_back( iVal );cout iVal;if ( iVal= accumulate( iVec.begin(), iVec.end(), iVal ) )cout ntThe sum of all the members and iVal is: iVal endl;system(pause

6、);return 0;4.假定v是vector类型的对象,则调用accumulate( v.begin(), v.end(), 0 )是否有错?如果有的话,错在哪里?没有错,accumulate函数必须满足第三个实参的类型与容器内的意思匹配,或者可以转化为第三个实参的类型。本题中double可以转化为int类型,但是会有较大误差。5.对于本节调用find_first_of的例程,如果不给it加1,将会如何。(1) 如果存在同时出现在两个list中的名字,则进入while循环,死循环;(2) 不存在同时出现在两个list中的名字,循环不会被执行。6.使用fill_n编写程序,将一系列int型值设

7、为0 。/ 11.18_11.6_fill_n.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)cout tInput some int numbers ( ctrl + z to end):nt ;vector iVec;int iVal;while ( cin iVal )iVec.push_back( iVal );cout ntThe content of ivec is :n;f

8、or ( vector:iterator it = iVec.begin(); it != iVec.end(); +it )cout *it ;fill_n( iVec.begin(), iVec.size(), 0 );cout ntAfter fill_n(), the content of ivec is :n;for ( vector:iterator it = iVec.begin(); it != iVec.end(); +it )cout *it ;cout endl;system(pause);return 0;7.判断下面的程序是否有错,如果有,请改正之:(a) vecto

9、r vec; list lst; int i;while ( cin i )lst.push_back(i);copy( lst.begin(), lst.end(), vec.begin() );(b) vector vec;vec.reserve( 10 );fill_n ( vec.begin(), 10, 0 );(a) 有错,vec是一个空容器,试图往一个空容器里复制数据,发生错误,应改为:copy( lst.begin(), lst.end(), back_inserter( vec ) );(b) 有错误,虽然为vec分配了内存,但是vec仍然是一个空容器,而在空vec上调用fi

10、ll_n会产生灾难,更正为:vector vec;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

11、stdafx.h#include #include #include #include #include using namespace std;bool isShorter( const string &s1, const string &s2 )return s1.size() = 4;string make_plural( size_t i, const string &s1, const string &s2 )return ( i = 1 ) ? s1 : s1 + s2;int _tmain(int argc, _TCHAR* argv)cout tInput some words

12、 ( ctrl + z to end):nt ;vector strVec;string strVal;while ( cin strVal )strVec.push_back( strVal );/ sortsort ( strVec.begin(), strVec.end() );vector:iterator end_unique = unique ( strVec.begin(), strVec.end() );strVec.erase( end_unique, strVec.end() );stable_sort( strVec.begin(), strVec.end(), isSh

13、orter );vector:size_type wc = count_if ( strVec.begin(), strVec.end(), GT4 );cout wc make_plural ( wc, word, s ) 4 letters or longer. endl;cout nt Unique words: endl;for ( vector:iterator it = strVec.begin(); it != strVec.end(); +it )cout *it ;cout endl;system(pause);return 0;10.标准库定义了一个 find_if 函数,

14、与find一样,find_if 函数带有一对迭代器形参,指定其操作的范围。与count_if一样,该函数还带有第三个形参,表明用于检查范围内每个元素的谓词函数。find_if 返回一个迭代器,指向第一个使为此函数返回非零值的元素。如果这样的元素不存在,则返回第二个迭代器实参。使用find_if函数重写上述例题中统计长度大于6的单词个数的程序部分。首先创建一个空的map容器m,然后再m中增加一个键为0的元素,并将其值赋值为1,第二段程序将出现运行时错误,因为v为空的vector对象,其中下标为0的元素不存在。对于vector容器,不能对尚不存在的元素直接赋值,只能使用push_back、inse

15、rt等函数增加元素。int iCnt = 0;vector:iterator wit = strVec.begin();while ( ( wit = find_if( wit, strVec.end(), GT7 ) != strVec.end() )iCnt+; +wit;cout iCnt make_plural ( iCnt, word, s ) with 6 more letters. endl;11.你认为为什么算法不改变容器的大小?为了使得算法能够独立于容器,从而普适性更好,真正成为“泛型”算法。12.为什么必须使用erase, 而不是定义一个泛型算法来删除容器中的元素。泛型算法

16、的原则就是不改变容器的大小。13. 解释三种插入迭代器的区别。区别在于插入的元素的位置不同:back_inserter,使用push_back实现在容器末端插入。front_inserter, 使用push_front实现在容器前端插入。inserter,使用insert实现插入,它还带有第二个实参:指向插入起始位置的迭代器。14.编程使用replace_copy将一个容器中的序列复制给另一个容器,并将前一个序列中给定的值替换为指定的新值。分别使用inserter、back_inserter和front_inserter实现这个程序。讨论在不同情况下输出序列如何变化。/ 11.18_11.14

17、_replace_copy.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)/vector iVec;int ia = 1, 2, 3, 4, 100, 5, 100 ;vector iVec( ia, ia+7 );/ testing out iVeccout ntThe contents of iVec: ;for ( vector:iterator it = iVec.begin()

18、; it != iVec.end(); +it )cout *it ;cout endl; list iLst; / copy iVecs member to iLst; cout n Using inserter: endl;replace_copy( iVec.begin(), iVec.end(), inserter( iLst, iLst.begin() ), 100, 0 );cout tThe contents of iLst: ;for ( list:iterator it = iLst.begin(); it != iLst.end(); +it )cout *it ;cout

19、 endl;cout n Using back_inserter: endl;iLst.clear();replace_copy( iVec.begin(), iVec.end(), back_inserter( iLst ), 100, 0 );cout tThe contents of iLst: ;for ( list:iterator it = iLst.begin(); it != iLst.end(); +it )cout *it ;cout endl;cout n Using front_inserter: endl;iLst.clear();replace_copy( iVec

20、.begin(), iVec.end(), front_inserter( iLst ), 100, 0 );cout tThe contents of iLst: ;for ( list:iterator it = iLst.begin(); it != iLst.end(); +it )cout *it ;cout endl;system(pause);return 0;15.算法标准库定义了一个名为unique_copy的函数,其操作与unique类似,唯一的区别在于:前者接受第三个迭代器实参,用于指定复制不重复元素的目标序列。编写程序使用unique_copy将一个list对象中不重复

21、的元素复制到一个空的vector对象中。/ 11.18_11.15_unique_copy.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)/vector iVec;int ia = 1, 2, 3, 4, 100, 100, 5 ;list iLst( ia, ia+7 );/ testing out iLstcout ntThe contents of iLst:nt;for ( li

22、st:iterator it = iLst.begin(); it != iLst.end(); +it )cout *it ;cout endl;vector iVec;/ copy iLsts member to iVec;cout n Using unique_copy, copy iLsts member to iVec: endl;unique_copy( iLst.begin(), iLst.end(), back_inserter( iVec) );cout ntThe contents of iVec:nt;for ( vector:iterator it = iVec.beg

23、in(); it != iVec.end(); +it )cout *it ;cout endl;system(pause);return 0;16. 重写(11.3.2节第3小节)的程序,使用copy算法将一个文件的内容写到标准输出中。/ 11.20_11.16_iostream_iertator.cpp : 定义控制台应用程序的入口点。/ 使用copy算法将一个文件的内容写到标准输出中#include stdafx.h#include #include #include #include #include using namespace std;int _tmain(int argc, _

24、TCHAR* argv)ostream_iterator out_iter( cout, n );ifstream inFile;inFile.open( 11.16.txt );if ( !inFile )cerr error file. endl;return -1;istream_iterator in_file_iter ( inFile ), eof;copy( in_file_iter, eof, out_iter );inFile.close();cout endl;system(pause);return 0; 17.使用一对istream_iterator对象初始化一个int

25、型的vector对象。/ 11.20_11.17_istream_iterator_vector.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)istream_iterator cin_it( cin ), end;vector iVec( cin_it, end );cout ntThe content of iVec:nt;for ( vector:iterator

26、 it = iVec.begin(); it != iVec.end(); +it )cout *it ;cout endl;system(pause);return 0;18.编程使用istream_iterator对象从标准输入读入一些列整数。使用ostream_iterator对象将偶数写到第二个文件,每个写入的值都存放在单独的行中。/ 11.20_11.18_istream_iterator_ostream_iterator.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include #include using n

27、amespace std;int _tmain(int argc, _TCHAR* argv)ofstream outFile_even, outFile_odd;outFile_even.open( outFile_even.txt );outFile_odd.open( outFile_odd.txt );if ( !outFile_even | !outFile_odd )cerr File cant be open. endl;return -1;istream_iterator in_iter( cin ), end;ostream_iterator out_odd_iter( ou

28、tFile_odd, );ostream_iterator out_even_iter( outFile_even, n );while ( in_iter != end )if ( *in_iter % 2 = 0 ) *out_even_iter+ = *in_iter+;else *out_odd_iter+ = *in_iter+ ;outFile_odd.close();outFile_even.close();cout endl;system(pause);return 0; 19.编写程序使用reverse_iterator对象以逆序输出vector容器对象的内容。/ 11.20

29、_11.19_reverse_iterator.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)int ia = 0, 1, 2, 3, 4 ;vector iVec( ia, ia + 5 );for ( vector:reverse_iterator rit = iVec.rbegin(); rit != iVec.rend(); +rit ) cout *rit ; cout endl;system(

30、pause);return 0;20.现在,使用普通的迭代器逆序输出上题中的元素。/ 11.20_11.20_ iterator_reverse.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)int ia = 0, 1, 2, 3, 4 ;vector iVec( ia, ia + 5 );for ( vector:iterator it = iVec.end() - 1; it iVec.begin()

31、; -it )cout *it ;cout *iVec.begin(); cout endl;system(pause);return 0;21.使用find在一个int型的list中需找值为0的最后一个元素。/ 11.20_11.21_list_find.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)int ia = 1, 2, 3, 4, 0, 6 ;list iLst( ia, i

32、a + 6 );for ( list:reverse_iterator rit = iLst.rbegin(); rit != iLst.rend(); +rit ) cout *rit ; cout endl ;list:reverse_iterator last_0_it = find( iLst.rbegin(), iLst.rend(), 0 );if ( last_0_it != iLst.rend() )cout Get the last 0, its value: *last_0_it endl;else cout We cant find the last 0. endl;co

33、ut endl;system(pause);return 0;22.假设有一个存储了10个元素的vector对象,将其中第3第7个位置上的元素以逆序复制给list对象。/ 11.20_11.22_vector_reverseCopyToList.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)int ia = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;vector iV

34、ec( ia, ia + 10 );cout tThe original iVecs content is:n;for ( vector:iterator it = iVec.begin(); it != iVec.end(); +it ) cout *it ; list iLst( iVec.rbegin() + 3, iVec.rbegin() + 8 );cout endl tAfter deal, list is:n;for ( list:iterator it = iLst.begin(); it != iLst.end(); +it )cout *it ;cout 输出迭代器 +

35、*前向迭代器 = != * -双向迭代器 = != + * - - 随机访问迭代器 = != + * - = _ +=24.List容器拥有什么类型的迭代器?而vector呢?双向迭代器,vector拥有随机访问迭代器。25.你认为copy算法需要使用哪种迭代器?而reverse和unique呢?copy 至少需要输入和输出迭代器;reverse算法至少需要双向迭代器;unique算法至少需要前向迭代器。26. 解释下列代码错误的原因,指出哪些错误可以在编译时捕获。(a) string sa10;const vector file_names( sa, sa+6 );(b) const vec

36、tor ivec;fill ( ivec.begin(), ivec.end(), ival );(c) sort( ivec.begin(), ivec.rend() );(d) sort( ivec1.begin(), ivec2.end() );(a) const 类型的vector对象,不可以写入,错误。 (b) 错了,两个实参迭代器是cosnt迭代器,不能用来修改容器中的元素。(c) 错了,用于算法的实参的两个迭代器必须是相同类型。(d) 错了,用于算法参数的迭代器必须属于同一个迭代器。 前三个错误均可以在编译时捕获。(d) 不能在编译时捕获。27.标准库定义了下面的算法:repla

37、ce( beg, end, old_val, new_val );replace_if ( beg, end, pred, new_val );replace_copy( beg, end, dest, old_val, new_val );replace_copy_if ( beg, end, dest, pred, new_val );只根据这些函数的名字和形参,描述这些算法的功能。第一个:由beg和end指定的输入范围内值为old_val的元素用new_val替换。第二个:由beg和end指定的输入范围内使得谓词pred为真的元素用new_val替换。第三个:由beg和end指定的输入范围内的元素复制到dest,并将值为old_val的元素用new_val替换。第四个:由beg和end指定的输入范围内的元素复制到dest,并将使得谓词为真的元素用new_val替换。28.假设lst是存储了100个元素的容器,请解释下面的程序段,并修正你认为的错误。vector vec1;reverse_copy ( lst.begin(), lst.end(), vec1.begin() );这段程序试图将lst中的元素以逆序的方式复制到

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁