2

ここに示されている次の例を理解しようとします。

template<class SinglePassRange1, class SinglePassRange2>
std::pair <
    typename range_iterator<SinglePassRange1>::type,
    typename range_iterator<const SinglePassRange2>::type
>
mismatch(SinglePassRange1& rng1, const SinglePassRange2& rng2);

そして、ここに説明があります:

不一致は、2 つの範囲 rng1 と rng2 の対応する要素が等しくない最初の位置を見つけます。

上記の例で明確でない主な点は、ミスマッチ関数の入力として何が与えられ、何が出力されるかということです。

rng1およびは、それぞれクラスおよびrng2のオブジェクトです。しかし、これらのクラスは何ですか?それらはどこで定義されていますか?それらは「範囲」であるはずですが、「範囲」とは何ですか?SinglePassRange1SinglePassRange2

mismatchまた、関数を呼び出す前のこれらすべての行が何をするのか、私には明確ではありません。最初の行はクラス テンプレートを定義するように見えますが、後で実行しません。

4

2 に答える 2

2

範囲は、同じコンテナーで動作する反復子のペアです。ASinglePassRange は、イテレータがシングル パス イテレータであるような範囲です。比較可能でインクリメント可能なイテレータ。関数をオーバーロードすることによりmismatch、パラメーターは、そのタイプの範囲反復子をサポートするコンテナーにすることもできます。その場合、コンテナーのbegin()およびend()反復子が使用されます。

返される値は、等価述語を満たさない反復子の最初のペア (各範囲の 1 つ) です。そのペアは、テンプレート パラメーター宣言の後の最初の数行で記述されているものです。

std::pair <
    typename range_iterator<SinglePassRange1>::type,
    typename range_iterator<const SinglePassRange2>::type
>

ご覧のとおり、各引数は各範囲型の範囲反復子の型です。

引数の前にキーワードtypenameが必要です。どちらも実際には従属名であるためです。他の型内で定義された型で、それ自体が外側のテンプレート パラメーター (SinglePassRange1および 2) に依存しています。

mismatch関数はおそらく次のようになります (型は省略されています) 。

 auto mismatch(auto &rng1, auto &rng2){
     auto it1 = rng1.first, it2 = rng2.first;
     while (it1 != rng1.second && it2 != rng2.second)
          if (it1 != it2)
              break;
          else { ++it1; ++it2; }
     return make_pair(it1, it2);  
 }
于 2013-04-10T09:17:41.650 に答える
1

また、不一致関数を呼び出す前のこれらすべての行が何をするのか、私には明らかではありません。最初の行はクラス テンプレートを定義するように見えますが、後で実行しません。

これは例ではありません。これは、boost range ライブラリの一部である関数テンプレートの宣言です。

上記の例で明確でない主な点は、ミスマッチ関数の入力として何が与えられ、何が出力されるかということです。

リンク先のページでさらに詳しく説明されているように、入力には、シングル パス範囲の概念のモデルである型が必要です。

ブースト範囲の詳細については、http: //www.boost.org/doc/libs/1_50_0_beta1/libs/range/doc/html/range/introduction.html を参照してください。

そこで述べたように、最も一般的な用途は標準コンテナを渡すことです。組み込み配列も機能します。またboost::iterator_range、範囲を形成する (前方) イテレータの任意のペアを使用できます。

だから、あなたが持つことができます

vector<string> vec { ... };
list<string> lis { ... };

auto result = mismatch(vec, lis);

ここresultにタイプがありますpair<boost::range_iterator<vector<string>>::type, boost::range_iterator<list<string>>::type>

于 2013-04-10T09:17:09.990 に答える