Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

02.05.2013, 02:41. Просмотров 1999. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2013, 02:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление элемента из vector (C++):

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

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

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

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

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

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

5
BumerangSP
4287 / 1409 / 121
Регистрация: 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
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 760
02.05.2013, 05:29 #3
действительно, если пользуетесь в цикле итераторами как инвариантом - никогда не удаляйте / не вставляйте новых элементов, это закон
итераторы нужны только для обхода контейнера (const iterator - точно, обычные - можно изменять сами значения, но никак не количество элементов)
хотя согласно последователям С++ типа Александреску - итераторы не нужны, займитесь бустом )
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
02.05.2013, 23:01 #4
Цитата Сообщение от ninja2 Посмотреть сообщение
Expression: vector erase iterator outside range
C++
1
It=vec.erase(It);
1
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.05.2013, 23:03 #5
В общем случае для векторов лучше использовать copy_if/remove_copy_if (в данном случае можно без if) из соображений производительности.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6511 / 3148 / 308
Регистрация: 04.12.2011
Сообщений: 8,716
Записей в блоге: 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
Привет! Вот еще темы с ответами:

Удаление элементов из vector<string> - C++
Здравствуйте.Решаю одну задачу, столкнулся с такой проблемой. Имеется vector&lt;string&gt;, в котором записан набор слов.Требуется удалить...

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

Удаление первых n элементов из vector - C++
Почему, к примеру, если k=3 а pop=2, то студия выдаст ошибку(итератор вне допустимого диапазона) при запуске функции erase. По моей логике,...

Удаление vector, list, string - C++
Привет! Такая задача. В программе я описал класс Class1. Класс содержит поля стандартных типов, а также поле std::string и...


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

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

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