2016-03-30 14 views
0

ベクトル、リンクリスト、およびダブルリンクリストに対して機能する汎用関数を作成する必要があります。 イテレータを使用して、valがベクトル、リンクリスト、または二重リンクリストにあるかどうかを調べるために解析したいと考えています。 一般的なイテレータの宣言方法はわかりません。以下は宣言の私の試みです。テンプレート化されたイテレータ宣言

template <class Container, class T> 
void findValue(Container &x, const T &val){ 
std::x<T>::iterator it; 
} 
+0

'std :: list 'をコンテナに渡し、 'Container :: iterator'を使用するのが1つの方法です。 – immibis

+1

'std :: find'を使わない理由はありますか? –

+0

@PeteBeckerまあ、この関数の最終的な目標は、valがすでに存在するかどうかを調べ、それが存在すれば関数が存在するところにvalを挿入することです。したがって、valが3の場合、{2,4,3,5}は{2,4,3,3,5}になります。そして私は、発見がその位置を返すとは思わない。 – Lin0523

答えて

0

C++コンテナは、ネストされたタイプiteratorを定義しているので、あなたは(autoが同じようにうまく動作しますが)あなたのfindValue関数内でイテレータを宣言するtypename Container::iteratorを使用することができます。 typename Container::value_typeを使用できるので、別のテンプレートパラメータとしてTを使用する必要もありません。

template<typename Container> 
void findValue(Container& x, const typename Container::value_type & val) 
{ 
    // could use 'typename Container::iterator' instead of 'auto' 
    for (auto it = begin(x); it != end(x); ++it) 
    { 
     if (*it == val) 
     { 
      std::cout << "found " << val << std::endl; 
      break; 
     } 
    } 
} 
+0

完璧に働いてくれてありがとう – Lin0523

関連する問題