1

indexベクトルから削除したい要素のインデックスを含むベクトルがありますwords

vector<int> Index;
vector<int> words;

この方法を試してみましたが、実行時にプログラムがクラッシュするのはなぜですか? 何が起こっている?

for(int t1 = 0; t1 < index.size(); t1++)
{
        words.erase(words.begin()+ index[t1])
}

ありがとうございました。

4

4 に答える 4

3

wordsと を宣言して初期化する方法を見ずに、プログラムがクラッシュする理由を正確に伝えることは困難ですindex

ただし、発生する可能性が最も高いのは、 から要素を削除したwords後、後続のすべての要素が 1 つの位置だけ左にシフトされた後、 のインデックスindexが、ベクトルの新しい終点を超えた位置にインデックスを付ける可能性があることです。

iベクトルのサイズより大きい場合、評価するwords.begin() + iと未定義の動作が発生します(この場合、クラッシュとして現れます)。

インデックスのベクトルが昇順でソートされている場合は、ループを元に戻します。

for(int t1 = index.size() - 1; t1 >= 0; --t1)
{
    words.erase(words.begin() + index[t1]);
}

または、元のループを使用して、インデックスを降順で並べ替えることができます。

于 2013-06-14T10:27:01.763 に答える
2

ここでの問題は、ベクトル内のいくつかの要素を消去しているときにベクトルのサイズを更新していることです。

代わりにこれを試してください:

for(int t1 = index.size()-1; t1 >= 0; --t1)
{
    words.erase(words.begin()+index[t1])
}
于 2013-06-14T10:27:17.587 に答える
2

逆の操作をしてみてください。後のインデックスを削除すると、それ以降のインデックスは無効になります。

インデックスは順序付けられていると想定しています。そうでない場合は、それらを注文してから、最初に最大のインデックスを削除することから始めてください。

于 2013-06-14T10:25:31.757 に答える
0
vector<int>a = {0,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0};
vector<int>index;
int t = 0;
while(t < a.size() && a[t] != 1)
{
    index.push_back(t);
    t = t + 1;
}

t = a.size()-1;
while( t > 0 && a[t] != 1)
{
    index.push_back(t);
    t = t - 1;
}
sort(index.begin(),index.end());
index.erase(std::unique(index.begin(), index.end()), index.end());
cout << "Before: ";
for(int i = 0; i <a.size();i++)
{
   cout << a[i] <<"   ";
}


cout << endl;
int counter = 0;
for(int i = 0; i < index.size();i++)
{
    a.erase(a.begin() + (index[i]-counter));
    counter = counter + 1;
}

cout <<"After: ";
for(int i = 0; i < a.size();i++)
{
   cout << a[i] <<"   ";
}
于 2013-06-14T11:39:27.723 に答える