Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
934 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
1

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

02.05.2013, 02:41. Просмотров 3296. Ответов 5
Метки нет (Все метки)

Здорова!
Пытаюсь удалить элемент из 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)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2013, 02:41
Ответы с готовыми решениями:

Удаление элемента из vector
Подскажите как удалить 1 элемент из массива типа vector, delete не работает почему-то?

Удаление элемента из std::vector<>
- Здравствуйте завсегдатаи! Подскажите пожалуйста, можно ли из STL-ского вектора std::vector&lt;int&gt;...

Вставка (с указанием положения) и удаление элемента в vector
Помогите сделать вставку с указанием положения #include &lt;iostream&gt; #include &lt;vector&gt; #include...

Удаление элемента из вектора ( std::vector<Bullet> )
Здравствуйте! У меня возникла проблема во время удаления элементов, значения которых не...

5
4293 / 1415 / 463
Регистрация: 16.12.2010
Сообщений: 2,938
Записей в блоге: 3
02.05.2013, 03:26 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());
1
276 / 275 / 83
Регистрация: 03.02.2013
Сообщений: 792
02.05.2013, 05:29 3
действительно, если пользуетесь в цикле итераторами как инвариантом - никогда не удаляйте / не вставляйте новых элементов, это закон
итераторы нужны только для обхода контейнера (const iterator - точно, обычные - можно изменять сами значения, но никак не количество элементов)
хотя согласно последователям С++ типа Александреску - итераторы не нужны, займитесь бустом )
0
Грамотный. Безпорно.
16622 / 9662 / 1863
Регистрация: 27.09.2012
Сообщений: 23,970
Записей в блоге: 2
02.05.2013, 23:01 4
Цитата Сообщение от ninja2 Посмотреть сообщение
Expression: vector erase iterator outside range
C++
1
It=vec.erase(It);
1
Higher
1944 / 1210 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.05.2013, 23:03 5
В общем случае для векторов лучше использовать copy_if/remove_copy_if (в данном случае можно без if) из соображений производительности.
0
Комп_Оратор)
Эксперт по математике/физике
8390 / 4146 / 567
Регистрация: 04.12.2011
Сообщений: 12,310
Записей в блоге: 14
03.05.2013, 03:07 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;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2013, 03:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вставка элемента в заданную позицию, удаление элемента по заданной позиции, поиск заданного элемента
Добавить в класс &quot;Односвязный список&quot; следующие функции: вставка элемента в заданную позицию,...

Удаление объекта из <vector>
Подскажите, пожалкуйста Имею следующий код: EditTest() - friend фукнция для другого класса,...

Удаление элементов из std::vector
У меня есть класс Zone. Но объявлен как массив vector в другом классе. class World { public:...

удаление vector<Ware *>: как?
Здравствуйте! У меня есть некоторый класс и в нем есть такой variable: vector&lt;Ware *&gt; wares; в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.