收藏 分享(赏)

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

上传人:精品资料 文档编号:11080027 上传时间:2020-02-06 格式:DOC 页数:18 大小:204.50KB
下载 相关 举报
C++Primer 第11章-泛型算法-课后习题答案.doc_第1页
第1页 / 共18页
C++Primer 第11章-泛型算法-课后习题答案.doc_第2页
第2页 / 共18页
C++Primer 第11章-泛型算法-课后习题答案.doc_第3页
第3页 / 共18页
C++Primer 第11章-泛型算法-课后习题答案.doc_第4页
第4页 / 共18页
C++Primer 第11章-泛型算法-课后习题答案.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、第 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 _tmain(int argc, _TCHAR* argv)co

2、ut iVec;int iVal;while ( cin iVal )iVec.push_back( iVal );cout iVal;int iCnt = 0;if ( iCnt = count( iVec.begin(), iVec.end(), iVal )cout #include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)cout strLst;string str;while ( cin str )strLst.push_back( str );cout str;size_t iC

3、nt = 0;if ( iCnt = count( strLst.begin(), strLst.end(), str)cout 容器对象中的元素之和。/ 11.19_11.3_accumulate_vector_int.cpp : 定义控制台应用程序的入口点。/#include “stdafx.h“#include #include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)cout iVec;int iVal;while ( cin iVal )iVec.push_back( iVal )

4、;cout iVal;if ( iVal= accumulate( iVec.begin(), iVec.end(), iVal ) )cout 类型的对象,则调用 accumulate( v.begin(), v.end(), 0 )是否有错?如果有的话,错在哪里?没有错,accumulate 函数必须满足第三个实参的类型与容器内的意思匹配,或者可以转化为第三个实参的类型。本题中 double 可以转化为 int 类型,但是会有较大误差。5.对于本节调用 find_first_of 的例程,如果不给 it 加 1,将会如何。(1) 如果存在同时出现在两个 list 中的名字,则进入 whil

5、e 循环,死循环;(2) 不存在同时出现在两个 list 中的名字,循环不会被执行。6.使用 fill_n 编写程序,将一系列 int 型值设为 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 iVec;int iVal;while ( cin iVal )iVec.push_back( iVal );cout :iterator

6、 it = iVec.begin(); it != iVec.end(); +it )cout :iterator it = iVec.begin(); it != iVec.end(); +it )cout 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 是一个空容器,试图往一个空容器里复制数据,发生错

7、误,应改为:copy( lst.begin(), lst.end(), back_inserter( vec ) );(b) 有错误,虽然为 vec 分配了内存,但是 vec 仍然是一个空容器,而在空 vec 上调用 fill_n会产生灾难,更正为:vector vec;vec.resize(10);fill_n( vec.begin(), 10, 0 );8.前面说过,算法不改变它所操纵的容器的大小,为什么使用 back_inserter 也不能突破这个限制?在使用 back_inserter 是,不是算法直接改变它所操作的容器的大小,而是算法操作迭代器back_inserter, 迭代器的

8、行为导致了容器的大小改变。9.编写程序统计长度不小于 4 个单词,并输出输入序列中不重复的单词。在程序源文件上运行和测试你自己的程序。/ 11.18_11.9_wc_GT4.cpp : 定义控制台应用程序的入口点。/#include “stdafx.h“#include #include #include #include #include using namespace std;bool isShorter( const string string make_plural( size_t i, const string int _tmain(int argc, _TCHAR* argv)co

9、ut 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(), isShorter );vector:size_type wc

10、= count_if ( strVec.begin(), strVec.end(), GT4 );cout :iterator it = strVec.begin(); it != strVec.end(); +it )cout :iterator wit = strVec.begin();while ( ( wit = find_if( wit, strVec.end(), GT7 ) != strVec.end() )iCnt+; +wit;cout #include #include #include using namespace std;int _tmain(int argc, _T

11、CHAR* argv)/vector iVec;int ia = 1, 2, 3, 4, 100, 5, 100 ;vector iVec( ia, ia+7 );/ testing out iVeccout :iterator it = iVec.begin(); it != iVec.end(); +it )cout iLst;/ copy iVecs member to iLst;cout :iterator it = iLst.begin(); it != iLst.end(); +it )cout :iterator it = iLst.begin(); it != iLst.end

12、(); +it )cout :iterator it = iLst.begin(); it != iLst.end(); +it )cout #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 :iterator it = iLst.begin(); it != iLst.end(); +it )cout

13、 iVec;/ copy iLsts member to iVec;cout :iterator it = iVec.begin(); it != iVec.end(); +it )cout #include #include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)ostream_iterator out_iter( cout, “n“ );ifstream inFile;inFile.open( “11.16.txt“ );if ( !inFile )cerr in_file_iter

14、( inFile ), eof;copy( in_file_iter, eof, out_iter );inFile.close();cout #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 :iterator it = iVec.begin(); it != iVec.end(); +it )cout #include #inc

15、lude #include using namespace 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 in_iter( cin ), end;ostream_iterator out_odd_iter( outFile_odd, “ “ );ostream_i

16、terator 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 #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)int ia = 0, 1, 2, 3, 4 ;vector

17、 iVec( ia, ia + 5 );for ( vector:reverse_iterator rit = iVec.rbegin(); rit != iVec.rend(); +rit ) cout #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(); -it )cout #incl

18、ude #include #include using namespace std;int _tmain(int argc, _TCHAR* argv)int ia = 1, 2, 3, 4, 0, 6 ;list iLst( ia, ia + 6 );for ( list:reverse_iterator rit = iLst.rbegin(); rit != iLst.rend(); +rit )cout :reverse_iterator last_0_it = find( iLst.rbegin(), iLst.rend(), 0 );if ( last_0_it != iLst.re

19、nd() )cout #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 iVec( ia, ia + 10 );cout :iterator it = iVec.begin(); it != iVec.end(); +it ) cout iLst( iVec.rbegin() + 3, iVec.rbegin() + 8 );cout :iterator it = iLst.begin();

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

21、onst vector file_names( sa, sa+6 );(b) const vector 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) 错了,用于算法参数的迭代器必须属于同一个迭代

22、器。 前三个错误均可以在编译时捕获。(d) 不能在编译时捕获。27.标准库定义了下面的算法:replace( 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 替换。第二个

23、:由 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 中的元素

24、以逆序的方式复制到 vec1 容器中。可能的错误为:1。 vec1 是一个空容器,尚未分配存储空间,可改为: vector vec1(100);2。另外 lst 容器中存储的元素不一定为 int 型。应该保证两种容器内存储的值的类型相同或者可以进行转换。29.用 list 容器取代 vector 重新实现 11.2.3 节编写的排除重复单词的程序。/ 11.20_11.29_list_wordCount.cpp : 定义控制台应用程序的入口点。/#include “stdafx.h“#include #include #include #include #include using names

25、pace std;bool isShorter( const string string make_plural( size_t i, const string int _tmain(int argc, _TCHAR* argv)cout strLst;string strVal;while ( cin strVal )strLst.push_back( strVal );/ sortstrLst.sort();strLst.unique(); list:size_type wc = count_if ( strLst.begin(), strLst.end(), GT4 );cout :iterator it = strLst.begin(); it != strLst.end(); +it )cout *it “ “;cout endl;system(“pause“);return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报