2013-06-14 3 views
1

У меня есть вектор index, который содержит индексы элементов, которые я хочу удалить с вектором words.Ошибка выполнения при стирании элементов из std :: vector

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

Я пробовал использовать этот метод, но моя программа вылетает во время работы, почему? Что происходит?

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

спасибо.

+0

Проблема: Ваше слово вектор обновляется после каждого стирания (размер, итераторов и т.д.), но не ваш индекс вектора, поэтому каждая последующая итерация удалить нежелательный элемент и в одном экземпляре индексный вектор возвращает индекс, отсутствующий в векторе Word. Решение: вы можете найти его ниже в ответе. Пожалуйста, примите ответ, который вам нужен. – MarsRover

ответ

2

Проблема в том, что вы обновляете размер вектора при стирании некоторых элементов в нем.

Попробуйте вместо этого:

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

Вектор слов вектор целых чисел векторных индекс содержит индексы целых чисел, что я должен удалить из слов Шаг 1: Я сортировать векторный указатель сортировать (index.begin(), index.конец()); Шаг 2: Я перебираю слова, чтобы удалить элементы –

+0

@HaniGoc: хмм, поэтому проблема немного сложнее, когда вы удаляете элемент вектора, он переупорядочивает содержимое вектора. –

+0

words.erase (слова [index [t1]]) Ошибка: нет соответствующей функции для вызова в std :: vector :: erase (int &) –

2

Попробуйте выполнить операцию в обратном порядке. Последующие индексы становятся недействительными после удаления более позднего индекса.

Я предположил, что ваши индексы упорядочены. Если нет, то закажите их, а затем убедитесь, что вы начинаете, удаляя сначала самый большой индекс.

+0

Это не workind –

3

Трудно точно сказать, почему ваша программа сбой, не видя, как вы объявляете и инициализируете words и index.

Однако наиболее вероятно, что после удаления элемента из words, и после того, как все последующие элементы были сдвинуты влево на одну позицию, индексы в index могут индексировать позиции, выходящие за пределы нового конца вектора.

Когда i больше, чем размер вектора, оценка words.begin() + i приведет к неопределенному поведению (которое в вашем случае проявляется как сбой).

Если вектор индексов сортируются в порядке возрастания, просто вернуть ваш цикл:

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

Или же, вы можете использовать свой первоначальный цикл и отсортировать индексы в уменьшении порядка.

+0

vector слова - вектор целочисленного вектора индекс содержит индексы целых чисел, которые я должен удалить из слов. Шаг 1: Сортировка вектора Сортировка индекса (index.begin(), index.end()); Шаг2: Я Переберите слов, чтобы удалить элементы –

+0

@HaniGoc: ОК, я редактировал ответить –

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] <<" "; 
} 
+0

Как вы можете видеть здесь, мне пришлось использовать счетчик, чтобы обновить индексный вектор. Я не знаю, надеюсь найти более легкое решение. Спасибо всем за вашу помощь. –

+0

Мне очень трудно понять, что этот код когда-либо делает, для чего он предназначен. Честно говоря, я бы придерживался решения Кевина. – TobiMcNamobi

Смежные вопросы