У меня есть картакак удалить записи из вектора <record>? - PullRequest
2 голосов
/ 15 марта 2011

Я перепробовал все возможности и не смог найти решения.Пожалуйста, помогите

Я хочу удалить записи в векторе на карте, перебирая его.

map < string, vector < record> >::iterator map_it;
for(map_it = map_records.begin(); map_it != map_records.end(); ++map_it){
    vector < record>::iterator vec_it;
    for(vec_it = (*map_it).second.begin(); vec_it != (*map_it).second.end();){
        if(condition){
            cout << (*map_it).second.size() << endl;
            vec_it = map_it->second.erase(vec_it);
            cout << (*map_it).second.size()<< endl;
        } else {
            ++vec_it;
        }
    }
}

Я пробовал что-то вроде этого,
(*map_it).second.erase(vec_it)
Этоукажите длинное число, если я запросю его размер, и программа завершится с ошибкой сегментации

ВЫХОД:
18446744073709551615
18446744073709551615
Ошибка сегментации

Любая помощь оценена

Ответы [ 4 ]

4 голосов
/ 15 марта 2011
   vec_t = map_it->second.erase(vec_it); //note the assignment!

Вам также необходимо немедленно проверить его действительность, поэтому лучше переписать внутренний цикл как:

for(vec_it = (*map_it).second.begin(); vec_it != (*map_it).second.end(); )
{
    if(condition)
        vec_it = map_it->second.erase(vec_it);
    else
      ++vec_it;
}
2 голосов
/ 15 марта 2011

Вы делаете недействительным свой итератор. Если вы собираетесь стирать объекты из своего вектора во время итерации по нему, вы должны обязательно принять возвращаемое значение стирания (которое является итератором следующего объекта). или vector :: end) и установите итератор в это значение, иначе он станет недействительным и ваша программа, вероятно, потерпит крах.

if(condition){
        vec_it = map_it->second.erase(vec_it);
    }

    //added for completeness
    //if the for loop has a ++vec_it, we should break before
    //it gets to do it on an end iterator
    if(vec_it == map_it->second.end()) {
      break;
    }
0 голосов
/ 15 марта 2011

Вместо условных стираний на векторе, используйте std::remove_ifа затем erase идиома.Это будет быстрее, потому что не будет перемещать все элементы вашего вектора несколько раз.

0 голосов
/ 15 марта 2011

В условном выражении вы можете сделать это:

vec_it = (*map_it).second.erase( vec_it );

И это сотрет элемент на карте в этой позиции итератора.

Дополнительная информация о C ++ Vector :: Erase ()

...