Форум программистов, компьютерный форум CyberForum.ru

Удаление элемента из vector - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
02.05.2013, 02:41     Удаление элемента из vector #1
Здорова!
Пытаюсь удалить элемент из vector<string>, но чото ошибку выдает и я вообще не пойму что за ошибка.
Вот код который ошибку выводит:
C++
1
2
3
4
5
6
7
8
//ydalenie elementov nachinayuchixc9 na a
    vector<string>::iterator It;
    
    for(It=vec.begin();It!=vec.end();++It)
    {
        if((*It)[0]=='a')
            vec.erase(It);//ydal9et element na kotorui ykazuvaet iterator
    }
Вроде все правильно написано как положено должен удалиться элемент, а не тут то было чото выскакивает окошко а внем сообщение об ошибке:

Debug Assertion Failed!

//тут пути идут.

Expression: vector erase iterator outside range

For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts

(Press Retry to debug the application)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
02.05.2013, 03:26     Удаление элемента из vector #2
Удаление происходит в цикле. Вполне вероятно, что на следующей итерации итератор может попытаться сослаться на удаленный элемент.

Добавлено через 5 минут
как вариант:
C++
1
2
3
4
5
6
bool op(std::string x)
{
    return x[0] == 'a';
}
...
vec.erase(std::remove_if(vec.begin(), vec.end(), op), vec.end());
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
02.05.2013, 05:29     Удаление элемента из vector #3
действительно, если пользуетесь в цикле итераторами как инвариантом - никогда не удаляйте / не вставляйте новых элементов, это закон
итераторы нужны только для обхода контейнера (const iterator - точно, обычные - можно изменять сами значения, но никак не количество элементов)
хотя согласно последователям С++ типа Александреску - итераторы не нужны, займитесь бустом )
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,841
Записей в блоге: 2
Завершенные тесты: 1
02.05.2013, 23:01     Удаление элемента из vector #4
Цитата Сообщение от ninja2 Посмотреть сообщение
Expression: vector erase iterator outside range
C++
1
It=vec.erase(It);
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.05.2013, 23:03     Удаление элемента из vector #5
В общем случае для векторов лучше использовать copy_if/remove_copy_if (в данном случае можно без if) из соображений производительности.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
03.05.2013, 03:07     Удаление элемента из vector #6
Вот такой вариант, вроде отслеживает действительность итераторов при удалении:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int main() {
vector<string>vec;
vec.push_back("absolutely");
vec.push_back("bcd");
vec.push_back("abc");
vec.push_back("dbce");
vec.push_back("gfd");
vec.push_back("absent");
 
vector<string>::iterator It;
vector<string>::iterator tmp;
vector<string>::iterator ItStrt=vec.begin();
vector<string>::iterator ItEnd=vec.end();
 
    for(It= ItStrt;It!=ItEnd;++It)
    {
tmp=It;
if(It->at(0)=='a'){
vec.erase(tmp);//после каждого удаления перенастраиваем итераторы:
ItStrt=vec.begin();
ItEnd=vec.end();
It=ItStrt;
if(vec.empty())break;
        }
    }
for(It= ItStrt;It!=ItEnd;++It)
    {
cout<<*It<<endl;
}
std::cout <<endl;
system("pause");
    return 0;
}
Yandex
Объявления
03.05.2013, 03:07     Удаление элемента из vector
Ответ Создать тему
Опции темы

Текущее время: 07:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru