container の iterator を返す

container と x を渡して、 x と等しくない cell の iterator を返します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. const_iterator 型の関数に container と x を渡して、x と等しくない cell の iterator を返します。
    find_not() 関数からリターンされた iterator を調べて、見つけた値を印字する main() 関数です。
    vector<int>::const_iterator p; が iterator の宣言です。
    /*★ Algorithm  Step5    前田  稔 ★*/
    #include <iostream>
    #include <vector>
    using namespace std;
    
    void main()
    {
        int t[] = { 3, 3, 3, 3, 3, 3, 7, 3, 3, 3 };
        vector<int> v(t, t+10);
    
        // vector v[]から3でない要素を見つける
        vector<int>::const_iterator p = find_not(v, 3);
        if (p != v.end())   cout << "見つかった!" << *p << endl;
        else    cout << "3 以外は見つからなかった!" << endl;
    }
    
  2. container に格納されているデータの中から x と等しくないデータを見つけ出す find_not() 関数です。
    <class Container, class T> で呼び出し側から渡される型を受け取ります。
    関数の戻り値に注目して下さい。
    今回の戻り値は Container で受け取ったコンテナの iterator です。
    この辺りになると、使用するコンパイラにより書き方が変わることをご承知置き下さい。
    typename Container::const_iterator
    find_not(const Container& c, const T& x) で呼び出し側から渡されたパラメータを受け取ります。
    c.begin() から c.end() までループしながら container の中を検索します。
    検索結果が格納されている first をリターンします。
    template<class Container, class T>
    typename Container::const_iterator
    find_not(const Container& c, const T& x)
    {   Container::const_iterator first = c.begin();
        while(first != c.end() && *first == x)  ++first;
        return first;
    }
    
  3. template では class Container と書かれることが多いのですが、class に代えて typename を使うことも出来ます。
    この辺りになると、使用するコンパイラにより使えないかも知れないことをご承知置き下さい。
    template<class Container, class T>
    template<typename Container, typename T>
    私としては typename を使う方が意味が通じると思うのですが。 (^_^;)

【演習】

  1. 次に list に格納して find_not() を呼び出します。
        int t[] = { 3, 3, 3, 3, 3, 3, 7, 3, 3, 3 };
        list<int> lst(t, t+10);
    
        // list lst[]から3でない要素を見つける
        list<int>::const_iterator p = find_not(lst, 3);
        if (p != v.end())   cout << "見つかった!" << *p << endl;
        
  2. begin(); や end(); を使っているので、配列には対応していないことを確認して下さい。
        int t[] = { 3, 3, 3, 3, 3, 3, 7, 3, 3, 3 };
    
        // int t[]から3でない要素を見つける
        int* i = find_not(t, 3);
        if (i != t+10 ) cout << "見つかった! " << *i << endl;
        

超初心者のプログラム入門(C/C++)