STLコンテナの終了イテレータと等しいイテレータをインクリメントするとどうなるか
質問
イテレータがベクトルの最後の要素を指しているときに、イテレータを2つインクリメントするとどうなりますか? この質問 で、STLコンテナへのイテレータを2要素ずつ調整する方法を尋ねていますが、2つの異なるアプローチが提供されています。
- 算術演算子の形式を使用する - +=2 または ++ を 2 回使用する。
- またはstd::advance()を使用する
イテレータがSTLコンテナの最後の要素以降を指す場合のエッジケースについて、VC++ 7で両方テストしてみました。
vector<int> vec;
vec.push_back( 1 );
vec.push_back( 2 );
vector<int>::iterator it = vec.begin();
advance( it, 2 );
bool isAtEnd = it == vec.end(); // true
it++; // or advance( it, 1 ); - doesn't matter
isAtEnd = it == vec.end(); //false
it = vec.begin();
advance( it, 3 );
isAtEnd = it == vec.end(); // false
vectorや他のコンテナをトラバースする際に、vector::end()と比較するようにというアドバイスを何度か見かけたことがあります。
for( vector<int>::iterator it = vec.begin(); it != vec.end(); it++ ) {
//manipulate the element through the iterator here
}
イテレータがループ内の最後の要素を越えて進めば、for-loop文の比較はfalseと評価され、ループは楽しく未定義の動作を続けることになることは明らかです。
もし、イテレータで advance() または何らかのインクリメント操作を使用して、コンテナの終わりを越えてポイントさせるなら、私はこの状況を検出することができないということは正しいですか? もしそうなら、ベスト プラクティスは何ですか - そのようなアドバンスメントを使用しないことですか?
どのように解決するのですか?
以下は、ニコライ・ヨスッティ氏の著書からの引用です。
advance()は を越えるかどうかをチェックしないことに注意してください。 を越えるかどうかをチェックしないことに注意してください (チェックできないのは イテレータは一般に コンテナを知らないため、チェックできません)。 したがって、この関数を呼び出すと を呼び出すと、未定義の動作になることがあります。 演算子 ++ をシーケンスの終端に対して呼び出すことは は定義されていません。
つまり、イテレータを範囲内に維持する責任は、完全に呼び出し側にあるのです。
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] std::vectorのイテレータのインデックスを取得する最も効果的な方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む