2011-12-25 18 views
0

私は以下の試験問題を解決しようとしていますが、問題があります。イテレータとジェネリック関数に関する試験問題

は、最初と最後 タイプTの要素のいくつかの配列と種類Tのオブジェクトobjの2回の反復子を取るC++関数find_elemを書きます。 は、 (first,last)の範囲の最初のオカレンス、またはobjのイテレータを返します。 (35%)

注:first & last必ずしも コンテナのbegin()end()メソッドによって返されるものと同じではありません!コンターはシーケンス(例:ベクトル、リスト、 など)であり、最後に指し示すものの前にある の要素を指すイテレータであることは、 です。最後に を参照してはなりません。end()という結果になる可能性があります。

は、ここに私の試み

template<typename Iter, typename Obj> 
Iter find_element(Iter iter1, Iter iter2, Obj &obj){ 
for(p = iter1; p != iter2; p++){ 
    if((*p) == obj){ 
    return p; 
    } 
return iter2; 
} 
} 

この試みが正しいですね。戻り値の型は関数に適していますか、間違った考えを持っていますか?

答えて

2

はい、コードは正しいです。おそらくObj &objからObj const &objに変更するだけです。

あなたはpと宣言しておかなければなりません。

多くのニックピッキング:一般的なイテレータでは、通常は++pという形式が適しています。

マイバリアント(基本的には同じ):ANSのため

template<typename Iter, typename Obj> 
Iter find_element(Iter iter1, Iter iter2, Obj const &obj) 
{ 
    for(; iter1 != iter2; ++iter1) 
    { 
     if(*iter1 == obj) 
      break; 
    } 
    return iter1; 
} 
+0

おかげで、条件が破損した場合、それは自動的にその時点で反復子を返すでしょうか?私はイテレータが特定のobjを指していると仮定します。 – Sun

+0

@Sun: 'break'でループが終了し、' return iter1; '行が実行されます。 'iter1'の値は、まさにその時に必要なものになります。 – Vlad

関連する問題