C++Primerノート+練習問題解答(十)


昨日MarkDownエディタを試してみた後、やはり新鮮さを味わわず、着実に古いエディタを使うことにしました.今日の10章では、主な内容は汎用アルゴリズムです.最近ずっと考えていて、本の上のいくつかの基礎知識をブログの中に移すかどうか、このようにして私はいつも本を写すような感じがします.それから私は考えてみましたが、やはり本を写しましょう.結局、あなたは天賦の才ではありません.本を写して記憶と理解を固めます.
間違いがあればご指摘ください
0.引用:
標準ライブラリでは、コンテナを定義する操作は少なく、
たとえば、使用した挿入削除操作などです.その機能を拡張するために、標準ライブラリは、各コンテナに対して機能関数を個別に定義するのではなく、汎用アルゴリズムのセットを定義することで、多くのコンテナが使用できるようにすることができます.
  • 汎用:汎用と呼ばれるのは、コンテナの特定のタイプに関係なく、アルゴリズムが操作するのは一般的に反復器であるためである.
  • アルゴリズム:アルゴリズムと呼ばれるのは、ソート検索などの古典的なアルゴリズムのインタフェースを実現したからです.

  • 1.汎用アルゴリズムの概要:
  • 1.ほとんどの定義はヘッダファイルalgorithmにあり、一部の数値アルゴリズムはnumericに定義されています.
  • 2.反復器範囲を使用して、特定のコンテナに依存しない汎用性を実現します.ただし、コンテナ内の要素タイプに依存します.たとえば、ソートするときにコンテナ内の要素が比較可能でない場合、ソートアルゴリズムの呼び出しも意味がありません.
  • 3.汎用アルゴリズムは、反復器レベルで動作するコンテナレベルの操作(ここでは、コンテナ内の挿入、削除などの操作)を実行しません.汎用アルゴリズムでは、コンテナのサイズは変更されず、エレメントが移動したり、エレメントが変更されたりする可能性がありますが、コンテナのサイズは直接変更されません.

  • 2.初期汎用アルゴリズム:
  • 2.1読取り専用アルゴリズム:
  • 入力範囲内の要素のみを読み、変更しません.
    例:
    find(beg,end,var);
    count   
    accumulate  。       numeric    。  :accumulate(beg,end,0);   0       。

    const_の使用を推奨iterator.
    equal  :              。
           ,      。       ==   。
      :equal(beg1,end1.beg2);beg2             。      ,                  。
  • 2.2コンテナ要素を修正するアルゴリズム:
  • fill(beg,end,var); var              。
    fill_n(dest,n,var); dest      。        n       var.             。
                  ,              。
    back_inserter,     :
                ,                   ,             。
                  ,                  ,          。                  ,                     ,            push_back       。
               iteraotr 。          ,         。
    -----------------------
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	vector ivec;
    	auto it = back_inserter(ivec);
    	fill_n(it, 10, 0);
    	ostream_iterator out(cout, " ");
    	copy(ivec.cbegin(), ivec.cend(), out);
    	system("pause");
    	return 0;
    }
    
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	vector ivec;
    	fill_n(ivec.begin(), 10, 0);//fill_n  。
    	fill(ivec.begin(), ivec.end(), 10); //fill  。
    	ostream_iterator out(cout, " ");
    	copy(ivec.cbegin(), ivec.cend(), out);
    	system("pause");
    	return 0;
    }
    copy  :
    copy(beg,end,beg1);       ,         ,                 ,        ,                。
    replace  :
    replace(beg,end,oldvar,newvar);        oldvar    newvar.
                 ,      replace_copy  。
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    vector ivec{ 1, 2, 3, 4, 5, 6, 5, 4, 3 };
    	ostream_iterator out(cout, " ");
    	cout << "Print all elements : ";
    	copy(ivec.cbegin(), ivec.cend(), out);
    	//  replace  。
    	cout << endl;
    	replace(ivec.begin(), ivec.end(), 3, 99);//     3        99。
    	cout << "Now ,print all the elements : ";
    	copy(ivec.cbegin(), ivec.cend(), out);
    	cout << endl;
    	vector ivec2;
    	replace_copy(ivec.begin(), ivec.end(), back_inserter(ivec2), 99, 3);
    	cout << "Print the elements of ivec : ";
    	copy(ivec.cbegin(), ivec.cend(), out);
    	cout << endl;
    	cout << "Print the elements of ivec2 : ";
    	copy(ivec2.cbegin(), ivec2.cend(), out);
    	system("pause");
    	return 0;
    }
    
  • 2.3コンテナ要素を再配置するアルゴリズム:
  • sort(beg,end);              
    unique(beg,end);              ,   ,    。         ,          ,     。

    3カスタムアクション:
  • 3.1像アルゴリズム伝達関数:
  • 述語:呼び出し可能な式で、条件値として使用できる、簡単に言えばブール値を返します.
    STLで用いられる述語は2種類に分けられ,述語関数が受けるパラメータの個数で区切られる.1元述語は1つのパラメータのみを受け入れ、2元述語は2つのパラメータを受け入れる.
    述語パラメータを受け入れるアルゴリズムは、述語関数のパラメータタイプがシーケンス内の要素タイプと一致する必要があるため、入力範囲内の要素に対して述語関数を呼び出します.
    例:
    sort(beg,end,short);
      short          ,        。
              short        。  short        ,            。
                      ,    stable_sort(beg,end,short);
  • 3.2 Lambda式:
  • 新しい言語の特性は解決しにくい問題が現れたからだ.たとえば,1元述語のみを受け入れるアルゴリズムは2つのパラメータを入力しなければならないが,このときは変化しなければならない,変則は通じるのか.
    呼び出し可能オブジェクト(Called object):1つのオブジェクトまたは式eについて、eが呼び出し演算子の左側に表示される場合、eを呼び出し可能と呼ぶ.
    現在知られている呼び出し可能なオブジェクトは、関数、関数ポインタです.また、呼び出し演算子を再ロードするクラスと、これから説明するlambda式の2つにも触れます.
    Lambda expressionに関する理解:
    呼び出し可能なコードユニット、匿名関数、インライン関数.3つの順位はlambda式をよく説明し、まず匿名は関数名を使わず、呼び出しは関数を少し備える機能を示すことができ、インライン関数はコードが比較的短いべきであることを示し、そうでなければインラインにも適していない.
    style:
    [capture list](parameter list) ->return type { function body} 
             ,      ,          ,      。                    ,     。
        :      ,      lambda              ,   static。
                      ,              。
    tips:lambda        ,              STL   ,  lambda            。
    #include 
    using namespace std;
    int main(){
    	auto f = [](int i){return ++i; };
    	cout << f(2)<	system("pause");
    	return 0;
    }
    
                 , lambda         return  ,        return          。
          ,             ,     void  。

    lambdaにパラメータを渡すには、次の手順に従います.
    デフォルトの実パラメータは存在せず、通常の関数の初期化パラメータ規則に合致します.
    取得リストの使用:
    キャプチャされたのは、所在する関数内の局所変数であり、パラメータ内であってもよいし、関数内の非static変数であってもよいし、lambda関数内で局所static変数を用いてもよいし、所在する関数外で定義された変数を用いてもよい.
  • 3.3 lambdaのキャプチャとリターン:
  • 取得関連:
    類似パラメータ伝達、値取得および参照取得.
    暗黙的なキャプチャ:関数体で使用される変数に基づいて、キャプチャリストの内容を推定します.一般に、キャプチャリストに=番号を書いて暗黙的な値キャプチャを表し、&暗黙的な参照キャプチャを表す.
    暗黙的なキャプチャと明示的なキャプチャを混在させることができますが、本をめくることができるルールに注意してください.
    値取得でmutableに遭遇した場合:
    通常、値がキャプチャされる場合は、関数内でキャプチャされた変数を修正しませんが、修正したい場合はmutableキーワードを付けることができます.
    取得した変数を関数内で変更できるかどうかは、参照するオブジェクトがローカルconstプロパティであるかどうかによって異なります.
    Lambdaの戻りタイプ:
    前述したように、複数日文の場合、最後に明示的に戻りタイプを指定し、最後に戻りタイプを設定することを覚えています.
  • 3.4パラメータバインド:
  • 標準ライブラリに由来するbind関数は、関数アダプタメカニズムです.呼び出し可能なオブジェクトを受け入れ、元のパラメータリストのニーズに適応するために呼び出し可能なオブジェクトを生成します.
      :auto newCallable=bind(Callable,arg_list);
       Callable newCallable       。Callable  bind      ,        。
       arg_list        ,  _1,_2,   。            placeholders 。
    using std::placeholders::_1;       ,        
    using namespace std::placeholders;           。

    一般的にプレースホルダが表すパラメータは入力範囲が伝わる要素であるべきで、不変の量に対してbind関数に直接置くパラメータテーブルであればよい.
    一般的に短い関数はlambdaを用い,大型関数であればbind関数版定を試してみることができる.この間には、新しく生成されたオブジェクトが呼び出されると、元の呼び出し可能なオブジェクトにマッピングされるマッピング関係があります.
    bind関数のarg_listsにも一般関数の伝値問題がある.しかし、coutオブジェクトなどの値はコピーできません.このときref関数とcref関数が現れます.
    一見引用につながる.このとき,パラメータリストはコピーではなく参照伝達であることを示す.
    4.反復器再プローブ:
    各コンテナに定義された反復器に加えて、ヘッダファイルiteratorでは特殊な用途の反復器も定義されています.
    1.insert iterator;
    2.stream iterator;
    3.reverse iterator;
    4.move iterator;               。
  • 4.1挿入反復器:
  •        :         ,push_back,push_front,insert     。
                 :back_inserter,front_inserter,inserter。
                      。              push_back   ,      back_inserter。
      inserter,     ,          ,          。

    関連関数のデモ:
    copy(beg,end,back_inserter(vec));
    copy(beg,end,inserter(vec,vec.begin());
  • 4.2 iostream_iterator:

  • 対応するストリームは特徴的な要素シーケンスとして処理される.
    分類:
    ostream_iterator 
    istream_iterator;

    istream_iteratorの操作:
    istream_iterator in_iter(cin); // cin  int.
    istream_iterator eof;  //           ,      。
    while(in_iter!=eof)
        vec.push_bacl(*in_iter++);
    vetor ivec(in_iter,eof);            。
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter numbers " << endl;
    	istream_iterator is(cin);
    	istream_iterator eof;
    	ostream_iterator out(cout, " ");
    	vector ivec(is, eof);
    	cout << "Output : ";
    	copy(ivec.begin(), ivec.end(), out);
    	cout << endl;
    	system("pause");
    	return 0;
    }

    アルゴリズムを使用してフロー反復器を操作するには、次の手順に従います.
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter numbers " << endl;
    	istream_iterator is(cin);
    	istream_iterator eof;
    	cout << accumulate(is, eof, 0);
    	system("pause");
    	return 0;
    }

    怠惰評価:istream_iterator反復器とストリームがバインドされている場合、すぐにストリームからデータを読み込むとは限らない.プログラムは、参照を解除したときに、データが正常に読み込まれていることを保証します.
    ostream_iteratorの操作:
    まず、istream_とは違ってiterator、これはテール反復器のようなものは存在しません.つまり、定義するときはオブジェクトをバインドしなければなりません.
    この反復器はオプションのパラメータを受け入れます.このパラメータはCスタイルの文字列でなければなりません.つまり、必ず空の文字で終わる必要があります.具体的な機能を体得すれば分かります.
    ostreamでiteratorが印刷するのは一番爽やかです.
    ostrem_iterator out(cout," ");
    for(auto x:vec)
      *out++=e;
              e    cout ,        。
     out               ,      :
    for(auto x:vec)
      out=e;
  • 4.3逆反復器:
  • 注意++と--の意味も逆転しています.処理forward_list以外では逆反復器がサポートされています.
    sortソートを呼び出すと,順序も逆転し,通常は小さいものから大きいもの,現在は大きいものから小さいものまでである.
    逆反復器のbase関数:
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	string line = "first,word,last";
    	//       。  find.
    	auto iter=find(line.begin(), line.end(), ',');
    	cout << string(line.begin(), iter);
    	//        。
    	cout << endl;
    	auto back_iter =find(line.rbegin(), line.rend(), ',');
    	cout << string(line.rbegin(), back_iter); //     ,    ?
    	cout << endl;
    	auto iter2 = back_iter.base();
    	cout << string(iter2, line.cend());
    	system("pause");
    	return 0;
    }

    5.汎用アルゴリズム構造:
    任意のアルゴリズムの最も基本的な特性は、反復器にどのような操作を要求するかです.
  • 5.1五種類の反復器:
  • 1.inpur iterator.     istream_iteraot;
    2.output iterator.    ostream_iterator;
    3forward iterator,     forward_list 。
    4.     .      ,      。
    5.       .       ,  vector,string,arrat,deque.
  • 5.2アルゴリズムパラメータモード:
  • 1.単一の現在の反復器のアルゴリズムを受け入れる:
    alg(beg,end,dest,other_args);
            。                  。
      dest             ,         。
  • 5.3命名規範:
  • 1.述語をリロード形式で渡すには、次の手順に従います.
    unique(beg,end)
    unique(beg,end,comp);//comp          。

    2._ifバージョン:
    finf(beg,end,val);
    find_if(beg,end,pred);
    
    pred   。

    3.コピーされたバージョンとコピーされていないバージョンを区別します.
    replace(beg,end,old,new);
    replac_copy(beg,end,back_inserter,old,new);
        replace_copy_if(beg,end,bac_inserter,old,new,pred);

    6.特定のコンテナアルゴリズム:
    コンテナに属するメンバー関数です.listとforward_を考慮します.Listのプロパティの後、コンテナは個別にいくつかの操作を定義します.
    merge/remove/reverse/sort/unque/splice

    7.練習問題の解答:
    10.1
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter numbers or Enter Ctrl+d to stop " << endl;
    	istream_iterator in(cin), eof;
    	vector ivec(in, eof);//           。
    	auto x=count(ivec.cbegin(), ivec.cend(), 10);//  10     。
    	cout << 10 << " occurs " << x << ((x > 1) ? " times " : " time ");
    	system("pause");
    	return 0;
    }

    10.2
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter numbers or Enter Ctrl+d to stop " << endl;
    	istream_iterator in(cin), eof;
    	list lst(in, eof);//           。
    	auto x=count(lst.cbegin(),lst.cend(),"hello");//  10     。
    	cout << "The string of hello "<< " occurs " << x << ((x > 1) ? " times " : " time ");
    	system("pause");
    	return 0;
    }

    10.3
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter numbers or Enter Ctrl+d to stop " << endl;
    	istream_iterator in(cin), eof;
    	cout << accumulate(in, eof, string());  //        numeric 。
    	cout << endl;
    	vector ivec{ 1, 2, 3, 4, 5, 6 };
    	cout << "The sum is " << accumulate(ivec.cbegin(), ivec.cend(), 0);
    	system("pause");
    	return 0;
    }

    10.4
            0,    0 int  ,        double.   。

    10.5
            。
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	list list1 = {"world", "hello"};
    	list list2 = { "world","hello"};
    	auto x=equal(list1.cbegin(), list1.cend(), list2.cbegin());
    	cout << x << endl;
    	system("pause");
    	return 0;
    }

    10.6
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	vector ivec;
    	fill_n(back_inserter(ivec), 10, 0);
    	ostream_iterator out(cout, " ");
    	cout << "Print all the elements : ";
    	copy(ivec.begin(), ivec.end(), out);
    	cout << endl;
    	system("pause");
    	return 0;
    }

    10.7
     。  :
    while (cin >> i)
    		lst.push_back(i);
    	copy(lst.begin(), lst.end(), back_inserter(ivec));
     。  :
    vector ivec;
    	ivec.resize(10);
    	fill_n(ivec.begin(), 10, 0);

    10.8
             ,        
                      。

    10.9
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    void elimDups(vector& word){
        cout << "For the first,Print all the elements :";
        for (auto x : word)
            cout << x << " ";
        cout << endl;
        sort(word.begin(), word.end());
        cout << "After sorting ,print all the elements : ";
        for (auto x : word)
            cout << x << " ";
        cout << endl;
        auto tmp = unique(word.begin(), word.end());
        cout << "After calling unique function ,print all the elements : ";
        for (auto x : word)
            cout << x << " ";
        cout << endl;
        cout << "Now ,the size of the container is " << word.size() << endl;
        word.erase(tmp, word.end());
        cout << "After erasing ,print all the elements :";
        for (auto x : word)
            cout << x << " ";
        cout << endl;
        cout << "Now ,the size of the container is " << word.size() << endl;
        //          ?unique      。
    }
    int main(){
        cout << "Enter strings " << endl;
        istream_iterator in(cin), eof;
        vector svec(in,eof);
        elimDups(svec);
        system("pause");
        return 0;
    }
    

    10.10
             ,          (       ),         。
                  ,          ,            ,          。

    10.11
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    bool is_shorter(const string& s1, const string& s2){
    	return s1.size() < s2.size();
    }
    void elimDups(vector& word){
    	cout << "For the first,Print all the elements :";
    	for (auto x : word)
    		cout << x << " ";
    	cout << endl;
    	stable_sort(word.begin(), word.end(),is_shorter);
    	cout << "After sorting ,print all the elements : ";
    	for (auto x : word)
    		cout << x << " ";
    	cout << endl;
    	auto tmp = unique(word.begin(), word.end());
    	cout << "After calling unique function ,print all the elements : ";
    	for (auto x : word)
    		cout << x << " ";
    	cout << endl;
    	cout << "Now ,the size of the container is " << word.size() << endl;
    	word.erase(tmp, word.end());
    	cout << "After erasing ,print all the elements :";
    	for (auto x : word)
    		cout << x << " ";
    	cout << endl;
    	cout << "Now ,the size of the container is " << word.size() << endl;
    	//          ?unique      。
    }
    int main(){
    	cout << "Enter strings " << endl;
    	istream_iterator in(cin), eof;
    	vector svec(in,eof);
    	stable_sort(svec.begin(),svec.end(), is_shorter);
    	for(auto x:svec)
    		cout << x << " ";
    	//elimDups(svec);
    	system("pause");
    	return 0;
    }

    10.12
    #include
    #include 
    #include
    #include 
    using namespace std;
    class Sales_data{
    public:
    	string isbn;
    	friend istream& operator>>(istream& is, Sales_data& p){
    		is >> p.isbn;
    		return is;
    	}
    	friend ostream& operator< Sales_data_vector;
    	Sales_data temp;
    	while (cin >> temp)
    		Sales_data_vector.push_back(temp);
    	sort(Sales_data_vector.begin(), Sales_data_vector.end(),compareIsbn);
    	for (auto x : Sales_data_vector)
    		cout << x << endl;
    	cout << endl;
    	system("pause");
    	return 0;
    }

    10.13
    #include
    #include 
    #include
    #include 
    using namespace std;
    bool more_than_five(const string& para){
    	return ((para.size() > 5) ? true : false);
    }
    int main(){
    	vector svec;
    	string word;
    	cout << "Enter strings " << endl;
    	while (cin >> word)
    		svec.push_back(word);
    	cout << "Before partition , print all the elements :"<

    10.14
    #include 
    using namespace std;
    int main(){
    	auto f = [](const int& va1, const int& va2) ->int {
    		return va1 + va2;};
    	cout << f(2, 3)<

    10.15
    #include 
    using namespace std;
    int main(){
    	int temp = 0;
    	cout << "Enter numbers :";
    	cin >> temp;
    	auto f = [&temp](int var){return temp + var; };
    	cout << f(2)<

    10.16
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    bool is_shorter(const string& s1, const string& s2){
        return s1.size() < s2.size();
    }
    void elimDups(vector& word){
        sort(word.begin(), word.end(), is_shorter);
        auto tmp = unique(word.begin(), word.end());
        word.erase(tmp, word.end());
    }
    void biggies(vector < string>& words, vector::size_type sz){
        elimDups(words);
        stable_sort(words.begin(), words.end(), [](const string& p1, const string    & p2){
            return p1.size() < p2.size(); });
            auto temp = find_if(words.begin(), words.end(), [=](const string p1){
                return p1.size()>sz; });
                auto count = words.end() - temp;
                for_each(temp, words.end(), [](const string& p){cout << p << " "; });
                cout << endl;
    }
    int main(){
        cout << "Enter strings " << endl;
        istream_iterator in(cin), eof;
        vector svec(in, eof);
        biggies(svec, 5);
        system("pause");
        return 0;
    }
    

    10.17
    #include
    #include 
    #include
    #include 
    using namespace std;
    class Sales_data{
    public:
    	string isbn;
    	friend istream& operator>>(istream& is, Sales_data& p){
    		is >> p.isbn;
    		return is;
    	}
    	friend ostream& operator< Sales_data_vector;
    	Sales_data temp;
    	while (cin >> temp)
    		Sales_data_vector.push_back(temp);
    	sort(Sales_data_vector.begin(), Sales_data_vector.end(), [](const Sales_data& p1, const Sales_data& p2){
    		return p1.isbn < p2.isbn; });
    		for (auto x : Sales_data_vector)
    			cout << x << endl;
    		cout << endl;
    		system("pause");
    		return 0;
    }

    10.18
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    bool is_shorter(const string& s1, const string& s2){
    	return s1.size() < s2.size();
    }
    void elimDups(vector& word){
    	sort(word.begin(), word.end(), is_shorter);
    	auto tmp = unique(word.begin(), word.end());
    	word.erase(tmp, word.end());
    }
    void biggies(vector < string>& words, vector::size_type sz){
    	elimDups(words);
    	stable_sort(words.begin(), words.end(), [](const string& p1, const string	& p2){
    		return p1.size() < p2.size(); });
    		auto temp = partition(words.begin(), words.end(), [=](const string p1){
    			return p1.size()<=sz; });
    			auto count = words.end() - temp;
    			for_each(temp, words.end(), [](const string& p){cout << p << " "; });
    			cout << endl;
    }
    int main(){
    	cout << "Enter strings " << endl;
    	istream_iterator in(cin), eof;
    	vector svec(in, eof);
    	biggies(svec, 5);
    	system("pause");
    	return 0;
    }

    10.19
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    bool is_shorter(const string& s1, const string& s2){
    	return s1.size() < s2.size();
    }
    void elimDups(vector& word){
    	sort(word.begin(), word.end(), is_shorter);
    	auto tmp = unique(word.begin(), word.end());
    	word.erase(tmp, word.end());
    }
    void biggies(vector < string>& words, vector::size_type sz){
    	elimDups(words);
    	stable_sort(words.begin(), words.end(), [](const string& p1, const string	& p2){
    		return p1.size() < p2.size(); });
    		auto temp = stable_partition(words.begin(), words.end(), [=](const string p1){
    			return p1.size()<=sz; });
    			auto count = words.end() - temp;
    			for_each(temp, words.end(), [](const string& p){cout << p << " "; });
    			cout << endl;
    }
    int main(){
    	cout << "Enter strings " << endl;
    	istream_iterator in(cin), eof;
    	vector svec(in, eof);
    	biggies(svec, 5);
    	system("pause");
    	return 0;
    }

    10.20
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter strings" << endl;
    	istream_iterator is(cin), eof;
    	vector svec(is, eof);
    	//    。
    	auto number = count_if(svec.begin(), svec.end(), [](const string& p){return p.size()<5; });
    	cout << "The length of string less than 5 occurs " << number << (number > 1 ? " times " : " time ")<

    10.21
    #include 
    using namespace std;
    int main(){
    	int val = 0;
    	cout << "Enter  a number :";
    	cin >> val;
    	auto f = [&]()->bool{
    		while (val != 0)
    			--val;
    		if (val == 0)
    			return true;
    		else
    			return false; };
    	if (f())
    		cout << "Successful" << endl;
    	else
    		cout << "Failed" << endl;
    	system("pause");
    	return 0;
    }

    10.22
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std::placeholders;
    using namespace std;
    bool check_size(const string& p,string::size_type sz){
    	return p.size()<=sz; 
    }
    int main(){
    cout << "Enter strings" << endl;
    istream_iterator is(cin), eof;
    vector svec(is, eof);
    //    。
    auto number = count_if(svec.begin(), svec.end(),bind(check_size,_1,6));
    cout << "The length of string less than 7 occurs " << number << (number > 1 ? " times " : " time ")<

    10.23
    bind       ?

    10.24
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std::placeholders;
    using namespace std;
    bool check_size(const string& p, string::size_type sz){
    	return p.size() > sz;
    }
    int main(){
    	cout << "Enter strings " << endl;
    	istream_iterator is(cin), eof;
    	vector svec(is, eof);
    	auto iter = find_if(svec.begin(), svec.end(), bind(check_size, _1, 6));
    	cout << *iter << endl;
    	system("pause");
    	return 0;
    }

    10.25
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    using namespace std::placeholders;
    bool is_shorter(const string& s1, const string& s2){
    	return s1.size() < s2.size();
    }
    bool check_size(const string& p, string::size_type sz){
    	return p.size() < sz;
    }
    void elimDups(vector& word){
    	sort(word.begin(), word.end(), is_shorter);
    	auto tmp = unique(word.begin(), word.end());
    	word.erase(tmp, word.end());
    }
    void biggies(vector < string>& words, vector::size_type sz){
    	elimDups(words);
    	stable_sort(words.begin(), words.end(), [](const string& p1, const string	& p2){
    		return p1.size() < p2.size(); });
    		auto temp = partition(words.begin(), words.end(), bind(check_size, _1, sz));
    		auto count = words.end() - temp;
    		for_each(temp, words.end(), [](const string& p){cout << p << " "; });
    		cout << endl;
    }
    int main(){
    	cout << "Enter strings " << endl;
    	istream_iterator in(cin), eof;
    	vector svec(in, eof);
    	biggies(svec, 5);
    	system("pause");
    	return 0;
    }

    10.26
         :
    1.back_inserter;
    2.front_inserter;
    3.inserter;
                。
    10.27
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter strings ." << endl;
    	istream_iterator in(cin), eof;
    	ostream_iterator out(cout, " ");
    	vector svec(in, eof);
    	cout << "Print all the elements in the vector :";
    	copy(svec.begin(), svec.end(), out);
    	cout << endl;
    	sort(svec.begin(), svec.end());
    	list lst;
    	unique_copy(svec.begin(), svec.end(), back_inserter(lst));//            。
    	cout << "Print all the elements in the list :";
    	copy(lst.begin(), lst.end(), out);
    	cout << endl;
    	system("pause");
    	return 0;
    }
    10.28
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	vector ivec1, ivec3, ivec{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    	list lst2;
    	ostream_iterator out(cout, " ");
    	copy(ivec.begin(), ivec.end(), back_inserter(ivec1));//       1-9.
    	cout << "Print all the elements in the container of ivec1 :";
    	copy(ivec1.begin(), ivec1.end(), out);
    	cout << endl;
    	copy(ivec.begin(), ivec.end(), front_inserter(lst2));//       9-1;
    	cout << "Print all the elements in the container of lst2 :";
    	copy(lst2.begin(), lst2.end(), out);
    	cout << endl;
    	copy(ivec.begin(), ivec.end(), inserter(ivec3,ivec3.begin()));//       1-9.
    	cout << "Print all the elements in the container of ivec3 :";
    	copy(ivec1.begin(), ivec1.end(), out);
    	cout << endl;
    	system("pause");
    	return 0;
    }
    11.29
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	ofstream out("test.txt");
    	out << "hello world . This is a sample " << endl;
    	out.close();
    	ifstream in("test.txt");
    	istream_iterator inflie(in), eof;
    	vector svec(inflie, eof);
    	cout << "Print all the elements :";
    	ostream_iterator output(cout, " ");
    	copy(svec.begin(), svec.end(), output);
    	cout << endl;
    	system("pause");
    	return 0;
    }
    11.30
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter numbers : ";
    	istream_iterator in(cin), eof;
    	vector ivec(in, eof);
    	cout << endl << "Call the sort function " ;
    	sort(ivec.begin(),ivec.end());
    	cout << "Output :";
    	ostream_iterator out(cout, " ");
    	copy(ivec.begin(), ivec.end(), out);
    	cout << endl;
    	system("pause");
    	return 0;
    }
    11.31
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter numbers : ";
    	istream_iterator in(cin), eof;
    	vector ivec(in, eof);
    	cout << endl << "Call the sort function " ;
    	sort(ivec.begin(),ivec.end());
    	vector ivec2;
    	unique_copy(ivec.begin(), ivec.end(), back_inserter(ivec2));
    	cout << "Output :";
    	ostream_iterator out(cout, " ");
    	copy(ivec2.begin(), ivec2.end(), out);
    	cout << endl;
    	system("pause");
    	return 0;
    }
    11.32
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    void func(ifstream& in, ofstream& out1, ofstream& out2){
    	istream_iterator infile(in), eof;
    	istream_iterator infile1(in), eof1;
    	//          。
    	ostream_iterator outfile(out1, " ");
    	ostream_iterator outfile1(out2, "
    "); copy_if(infile, eof,outfile, [](int val){return ((val % 2 != 0) ? true : false); }); copy_if(infile1, eof1,outfile1, [](int val1){return ((val1 % 2 != 0) ? false : true); }); } int main(){ ofstream out("test.txt"); out << 1 << 2 << 3 << 5 << endl; out << 22 << endl; out << 33 << endl; out.close(); ifstream in("test.txt"); ofstream out1("output_1.txt"), out2("output_2.txt"); func(in, out1, out2); system("pause"); return 0; }
    11.33
    略.
    11.34
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter numbers : ";
    	istream_iterator in(cin), eof;
    	vector ivec(in, eof);
    	auto iter = ivec.rbegin();
    	while (iter != ivec.rend())
    		cout << *iter++<
    11.35
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter numbers : ";
    	istream_iterator in(cin), eof;
    	ostream_iterator out(cout, " ");
    	vector ivec(in, eof);
    	copy(ivec.begin(), ivec.end(), out);
    	cout << endl;
    	system("pause");
    	return 0;
    }
    11.36
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	cout << "Enter numbers : ";
    	istream_iterator in(cin), eof;
    	ostream_iterator out(cout, " ");
    	list lst(in, eof);
    	//   find             。
    	auto end = lst.rbegin(), beg = lst.rend();
    	auto iter = find(end, beg, 0);
    	if (iter == lst.rend())
    		cout << "Not be present !" << endl;
    	else
    		cout << "Be present !" << endl;
    	system("pause");
    	return 0;
    }
    11.37
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	vector ivec{ 1, 2, 13, 14, 15, 16, 17, 8, 9, 10 };
    	auto iter1 = ivec.rbegin() + 3;
    	auto iter2 = ivec.rend() - 2;
    	list lst;
    	copy(iter1, iter2, back_inserter(lst));
    	ostream_iterator out(cout, " ");
    	copy(lst.begin(), lst.end(), out);
    	cout << endl;
    	system("pause");
    	return 0;
    }
    11.38
    1.     。
    2.     。
    3.     。
    4.     。
    5.       。
    
    11.39
    list          。
    vector        。
    11.40
      copy      ,         。
    reverse     。
    unique        。
    
    11.41
    1.               。
    2.               。
    3.            。
    4.           ,         。
    11.42
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    void elimDups(list& lst){
    	lst.sort();
    	lst.unique();//     erase  ,  list unique     。
    }
    int main(){
    	cout << "Enter strings :" << endl;
    	istream_iterator in(cin), eof;
    	list lst(in,eof);
    	elimDups(lst);
    	ostream_iterator out(cout, " ");
    	copy(lst.begin(), lst.end(), out);
    	cout << endl;
    	system("pause");
    	return 0;
    }

    8.後記:
    今日学友の集まりに行って、以前の先生を见て、とても楽しくて、とても楽しいです.
    End