1

次の問題があります: 2 つの反復子と値を取り、値が 2 つの間にあるかどうかをチェックする関数を作成する必要があります。キャッチ: イテレータと値からの要素の型を示すテンプレート パラメータを 1 つしか持つことができません。

私の試みは次のようなものですが、うまくいかないようです:

template <typename T>
T myFind(iterator<std::bidirectional_iterator_tag,T> begin, iterator<std::bidirectional_iterator_tag, T> end, T elem){
// Code
}

しかし、これは機能しません:

// vector<int> vect; list<string> lst;
myFind(vect.begin(), vect.end(), 15);
myFind(lst.begin(), lst.end(), "some element");

何か案は?変更後のコード:

 template <typename T> 
 T myFind(T begin, T end,typename std::iterator_traits<T>::value_type elem){
   for(T it = begin; it != end; ++it){
     if(*it == elem){
       return it;
     }
    }
    return end;
 }
4

1 に答える 1

1

イテレータ型のテンプレート パラメータを 1 つ指定できますか? もしそうなら:

template <typename It>
typename std::iterator_traits<It>::value_type
myFind(It begin, It end, typename std::iterator_traits<It>::value_type elem){
  // ...
}

そうでなければ、あなたの制限は強すぎると思います。

編集後:-返されたイテレータで実行する場合 (コメントで示しているように)、ランダム アクセス イテレータが必要です。ただし、std::list::iterator双方向イテレータなのでできません。を使用する必要がありますstd::prev(または C++03 では、std::advanceを使用します)。

于 2012-12-07T12:37:28.660 に答える