ベクターイレーズイテレータ
2023-10-02 16:34:16
質問
私はこのコードを持っています。
int main()
{
vector<int> res;
res.push_back(1);
vector<int>::iterator it = res.begin();
for( ; it != res.end(); it++)
{
it = res.erase(it);
//if(it == res.end())
// return 0;
}
}
"関数呼び出しによって消去された最後の要素に続く要素の新しい場所を指すランダムアクセスイテレータで、操作によってシーケンスの最後の要素が消去された場合はベクターエンドとなります。
このコードはクラッシュしますが、もし私が
if(it == res.end())
の部分を使ってから戻ると、動作します。なぜでしょうか?forループがキャッシュしているのは
res.end()
をキャッシュしているので、not equal演算子が失敗するのでしょうか?
どのように解決するのですか?
res.erase(it)
は常に次の有効なイテレータを返すので、もし最後の要素を消した場合は
.end()
ループの最後には
++it
が常に呼び出されるので、インクリメントして
.end()
をインクリメントすることになりますが、これは許されることではありません。
をチェックするだけで
.end()
をチェックするだけではバグが残ります。なぜなら、繰り返しのたびに必ず要素をスキップしてしまうからです (
it
からの戻り値で 'インクリメント' されます。
.erase()
からの戻り値、そしてループによって再び増加します)
のようなものが欲しいのではないでしょうか。
while (it != res.end()) {
it = res.erase(it);
}
で各要素を消去します。
(念のため。これは単純化された例だと仮定しています。もし、単にすべての要素に対して操作(例えば削除)を行わずに消したいのであれば、単純に
res.clear()
)
条件付きで要素だけを消す場合、おそらく次のようなものが必要でしょう。
for ( ; it != res.end(); ) {
if (condition) {
it = res.erase(it);
} else {
++it;
}
}
関連
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] std::vector にある項目が存在するかどうかを調べるには?
-
[解決済み] 基本的なイテレータを作るには?
-
[解決済み] std::vector<> からインデックスで要素を消すにはどうしたらいいですか?
-
[解決済み] C++コンテナにおけるイテレータの無効化ルール
-
[解決済み] std::vectorのイテレータのインデックスを取得する最も効果的な方法は何ですか?
-
STLコンテナの終了イテレータと等しいイテレータをインクリメントするとどうなるか
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] 現在のCまたはC++の標準文書はどこにありますか?
-
[解決済み] ベクトルから要素を消去する