1

関数テンプレート Count についての例に従っていましたが、何かが欠けています。確かに、私は完全に iterator_traits を理解していなかったので、混乱しています:

テンプレート関数 COUNT は次のように宣言されています。

template <class InputIterator, class T>
  typename iterator_traits<InputIterator>::difference_type  
   count (InputIterator first, InputIterator last, const T& val);

私の質問:

1) iterator_traits::difference_type を使用する理由 この関数は、単純な を使用しない理由としてオブジェクトを返します:

template <class InputIterator, class T>
 T count(InputIterator first, InputIterator last, const T& val); 

私は試して働きました。

2) iterator_traits を使用しなければならない場合、「value_type」(反復子が指すことができる値) ではなく、「different_type」(1 つの反復子を別の反復子から減算する) を使用する必要があるのはなぜですか?

この場合でも試してみました。

関数が Iterator を返すときに iterator_traits を使用する必要があると思いましたが、テンプレート関数 FIND を見て、さらに混乱しました。

template <class InputIterator, class T>
 InputIterator find (InputIterator first, InputIterator last, const T& val);

一方、私は次のようにコーディングします:

template <class InputIterator, class T>
 typename iterator_traits<InputIterator>::value_type 
  find( nputIterator first, InputIterator last, const T& val);

誰かがこの点を明確にすることができますか?

ご協力いただきありがとうございます。

4

4 に答える 4

1

1)std::count何かに等しいものを数えることになっています。たとえば、コンテナがリンゴを保持している場合、リンゴを数えるのにリンゴは役に立たないため、リンゴオブジェクトを返すことは役に立ちません(少なくとも私が考えている種類のリンゴではありません)。

std::vector<Apple> apples = ...;
Apple an_apple;
auto n = std::count(apples.begin(), apples.end(), an_apple);

ここで、 の型はn、潜在的に多数のものを数えることができるものでなければなりません。Appleと同じオブジェクトの数を数えていますan_apple

2)コンテナstd::find要素へのハンドルとして使用できるものを返し、要素が存在するかどうかを確認する必要があります。イテレータは、まさにこれを行うための優れた手段を提供します。a) 探しているもののコピーが既にあり、b) 通常、要素が見つからなかったことを示すために「null」値を返すことはできないため、値を返すことは意味がありません。

于 2013-07-01T15:40:06.040 に答える
1

は特定の要素のカウントstd::countを返すことになっているため、戻り値の型は整数型である必要がありますが、必ずしも整数型である必要はありません (正確には要素の型です)。T

于 2013-07-01T15:41:11.300 に答える
0

1) イテレータが指す値は何でもかまいません。必ずしもカウントを表すことができる値ではありません。count は数値型を返し、選択した数値型は反復子の difference_type です。

2) 繰り返しますが、value_type は反復子が指すものの型であり、必ずしも数値ではありません。

于 2013-07-01T15:39:05.650 に答える
0

find() 関数で指定したばかりのオブジェクトを返すようにしたいのはなぜですか? find が行うことは、探しているオブジェクトが格納されているコンテナ内の場所を探すことです。

于 2013-07-01T15:53:49.847 に答える