1

私が取り組んでいるかなり長いプログラムがあり、ベクトルから要素を削除するのに苦労しています。私は非常に単純なベクトルでそれをやろうとしましたが、同じ問題を抱えています。私が見る限り、私は他の人の質問で誰もが説明したのと同じ方法でそれを行いました. これが簡単なコードです。

vector<int> vect;
vect.push_back(3);
vect.push_back(2);
cout << vect[1];  // prints '2'
vect.erase(vect.begin()+1);
cout << vect[1] << endl; // prints '2'

私は何を間違っていますか?

最後にサイズを確認したところ、「1」と出力されたため、上記のコードは機能しているようです。ただし、実際のコードはそうではありません。

size = A[i]->B().size();
cout << "size is " << A[i]->B().size() << endl;  // prints 21
A[i]->B().erase(A[i]->B().begin()+size);
cout << "size now " << A[i]->B().size() << endl;  // prints 21

私が違うことをしたことがわかりませんか?A は、他のベクトルを格納するベクトルです。B ベクトルの最後の要素を削除したい。

4

3 に答える 3

5

要素を消去した後、ベクターのサイズは 1 になり (消去前は 2 だったため)、基本的にvect[1]、インデックスを持つ要素がなくなるため、式は未定義の動作に1なります。残っているのは 1 つの要素 (値 = 3、インデックス = 0) だけです。vect.at(1)の代わりに使用するとvect[1]、 がスローされstd::out_of_rangeます。

編集後: サイズが の場合、NNベクトルの有効なインデックスではないことに注意してください!!! 要素にはインデックスが付けられます0, 1, 2, ... N-1。実際、サイズは1であるため、有効なインデックスは0

于 2012-10-28T14:27:44.357 に答える
2

あなたがしていることは未定義の動作です。基本的に、ベクトルの現在の最後の要素を超えてアクセスしているため、たまたまここに残っていたゴミが見つかります。範囲チェックが組み込まれているため、要素にアクセスするat代わりに使用すると、問題が明らかになります。[]at

// cout << vect[1] << endl;
cout << vect.at(1) << '\n';

上記のように置き換えると、指定したインデックスが無効であることを示す[]例外が発生します。atstd::out_of_range

于 2012-10-28T14:29:39.257 に答える
1

ベクトルの最後の要素を削除するには、 を使用できます.pop_back()。また、反復子に整数を追加することは悪い考えであることに注意してください。vector<int>::iterator追加する変数として代わりに使用します。

于 2017-01-02T20:44:42.463 に答える