Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

02.05.2013, 02:41. Просмотров 2232. Ответов 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)

http://www.cyberforum.ru/cpp-beginners/thread411644.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2013, 02:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удаление элемента из vector (C++):

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

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

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

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

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

5
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 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
abit
272 / 271 / 83
Регистрация: 03.02.2013
Сообщений: 770
02.05.2013, 05:29 #3
действительно, если пользуетесь в цикле итераторами как инвариантом - никогда не удаляйте / не вставляйте новых элементов, это закон
итераторы нужны только для обхода контейнера (const iterator - точно, обычные - можно изменять сами значения, но никак не количество элементов)
хотя согласно последователям С++ типа Александреску - итераторы не нужны, займитесь бустом )
0
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
02.05.2013, 23:01 #4
Цитата Сообщение от ninja2 Посмотреть сообщение
Expression: vector erase iterator outside range
C++
1
It=vec.erase(It);
1
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.05.2013, 23:03 #5
В общем случае для векторов лучше использовать copy_if/remove_copy_if (в данном случае можно без if) из соображений производительности.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3295 / 448
Регистрация: 04.12.2011
Сообщений: 9,117
Записей в блоге: 5
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
03.05.2013, 03:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2013, 03:07
Привет! Вот еще темы с решениями:

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

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

Удаление первых n элементов из vector
Почему, к примеру, если k=3 а pop=2, то студия выдаст ошибку(итератор вне...

Удаление элементов из vector<string>
Здравствуйте.Решаю одну задачу, столкнулся с такой проблемой. Имеется...


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

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

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