《c++primer(第4版)习题解答_第十一章》由会员分享,可在线阅读,更多相关《c++primer(第4版)习题解答_第十一章(18页珍藏版)》请在金锄头文库上搜索。
1、第十一章 泛型算法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)cout i
2、Vec;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 iCnt =
3、 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 );cout
4、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 中的名字,则进入 while 循环,死
5、循环;(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 it = iV
6、ec.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 是一个空容器,试图往一个空容器里复制数据,发生错误,应改为:co
7、py( 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 &s1, const string &s2 )return s1.size() = 4;string make_plural( size_t i, const string &s
9、1, const string &s2 )return ( i = 1 ) ? s1 : s1 + s2;int _tmain(int argc, _TCHAR* argv)cout 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, s
10、trVec.end() );stable_sort( strVec.begin(), strVec.end(), isShorter );vector:size_type wc = 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()
11、 )iCnt+; +wit;cout #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 :iterator it = iVec.begin(); it != iVec.end(); +it )cout iLst;/ copy iVecs member to iLst;cout :iterator i
12、t = iLst.begin(); it != iLst.end(); +it )cout :iterator it = iLst.begin(); it != iLst.end(); +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( i
13、a, ia+7 );/ testing out iLstcout :iterator it = iLst.begin(); it != iLst.end(); +it )cout 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
14、( cout, n );ifstream inFile;inFile.open( 11.16.txt );if ( !inFile )cerr in_file_iter ( 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_
15、it, end );cout :iterator it = iVec.begin(); it != iVec.end(); +it )cout #include #include #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 )cer
16、r in_iter( cin ), end;ostream_iterator out_odd_iter( outFile_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 #include #include using namespace std;