0

標準ライブラリ関数を使用して値のベクトルを検索するfind()と、次のコードは適切な参照を返しますか? 検索でベクター内に目的の値が見つかった場合、その値への参照が返されます。そうでない場合は、値を最後にプッシュし、新しい値への参照を返す必要があります。

わかりません。a.back()定義による参照であるため、返すことは問題ありません。i私が確信が持てないことが見つかった場合、イテレータを逆参照しています。

 int& foo(int i)
 {
     std::vector<int>::iterator found = find(a.begin(), a.end(), i);
     if (found != a.end())
     {
        return *found;
     } else {
        a.push_back(i);
        return a.back();
     }
 }

わかりません。a.back()定義による参照であるため、返すことは問題ありません。i私が確信が持てないことが見つかった場合、イテレータを逆参照しています。おそらく明らかなように、全体のポイントは、関数を左辺値として機能させることです。確かにコンパイルされますが、正しいかどうかはわかりません。

4

2 に答える 2

2

イテレータを逆参照すると、参照が取得されます。基本的には(ランダム アクセス イテレータを持つコンテナーの場合)a.back()と同等です。*(a.end() - 1)つまり、機能は正常に見えます。std::vector<T>要素への参照は、ベクトルが破棄されるか、ベクトルのサイズ変更などにより要素が再配置されるまで有効であることに注意してください。

于 2013-09-27T20:04:10.863 に答える
1

どちらの場合でもOKです。

  • § 24.2.2 / 表 106による: iteratorrの場合、式*rは参照を返します。

  • § 23.3.6.1によると、メソッドback()は参照を返します。

また、それらを参照として返すこともできます。

于 2013-09-27T20:07:49.273 に答える