begin()~end() で検索して iterator を返す

begin() と end() と x を渡して、x と等しくない cell の iterator を返します。

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

プログラムの説明

  1. const_iterator 型の関数に begin() と end() と x を渡して、x と等しくない cell の iterator を返します。
    container では無く iterator を渡すことにより配列(int型, float型など)にも対応出来るようになります。
    STL のアルゴリズムでも、その多くが iterator を渡しています。
  2. find_not() 関数を呼び出す main() プログラムです。
    最初に int 型の配列 a[] で find_not() を呼び出します。
    find_not() 関数でリターンされた iterator を調べて、見つけた値を印字します。
    /*★ Algorithm  Step6    前田  稔 ★*/
    #include <iostream>
    #include <vector>
    using namespace std;
    
    void main()
    {
        int a[] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 5 };
        // int a[]から3でない要素を見つける
        int* i = find_not(a, a+10, 3);
        if (i != a+10 ) cout << "見つかった! " << *i << endl;
    }
    
  3. container に格納されているデータの中から x と等しくないデータを見つけ出す find_not() 関数です。
    <class InputIterator, class T> で呼び出し側から渡される型を受け取ります。
    InputIterator や T は、このような時に良く使われる名前で、キーワードではありません。
    次の行に書かれている InputIterator は関数の戻り値です。
    find_not(Iterat first, Iterat last, const T& x) でパラメータを受け取ります。
    first から last までループしながら container の中を検索します。
    検索結果が格納されている first をリターンします。
    template<class InputIterator, class T>
    InputIterator
    find_not(InputIterator first, InputIterator last, const T& x)
    find_not(Iterat first, Iterat last, const T& x)
    {
        while(first != last && *first == x) ++first;
        return first;
    }
    

【演習】

  1. vector v で find_not() を呼び出します。
    find_not() 関数でリターンされた iterator を調べて、見つけた値を印字します。
        int t[] = { 3, 3, 3, 3, 3, 3, 7, 3, 3, 3 };
        vector<int> v(t, t+10);
        // vector v[]から3でない要素を見つける
        vector<int>::iterator p = find_not(v.begin(), v.end(), 3);
        if (p != v.end())   cout << "見つかった! " << *p << endl;
        
  2. 次に list に格納して find_not() を呼び出します。
        int b[] = { 8, 3, 3, 3, 3, 3, 3, 3, 3, 3 };
        list<int> lst(b, b+10);
        // list lst[]から3でない要素を見つける
        list<int>::const_iterator q = find_not(lst.begin(), lst.end(), 3);
        if (q != lst.end())   cout << "見つかった! " << *q << endl;
        
  3. 他の container や配列にも対応していることを確認して下さい。

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