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

Удаление элемента из вектора - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.09.2013, 18:39     Удаление элемента из вектора #1
Здорова!

Пытаюсь удалить элемент из вектора, но чото ничего не получается от код:
C++
1
2
3
4
5
6
7
8
9
10
11
//My_filter f(cin,cout);
    vector<int> v(3,4);
    vector<int>::iterator it;
    cout <<"v.size()= "<<v.size()<<endl;
    for(it=v.begin();it!=v.end();++it)
        it=v.erase(it);
    cout <<endl;
    cout <<"v.size()= "<<v.size()<<endl;
 
    //return main_loop(&f);
    return 0;
Вылетает окно и все.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2013, 18:39     Удаление элемента из вектора
Посмотрите здесь:

C++ Удаление элемента вектора в цикле.
C++ вставка элемента в заданную позицию, удаление элемента по заданной позиции, поиск заданного элемента
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А C++
C++ Удаление элемента из вектора ( std::vector<Bullet> )
C++ Удаление [i][j] элемента из вектора типа string
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.09.2013, 19:00     Удаление элемента из вектора #2
Цитата Сообщение от ninja2 Посмотреть сообщение
for(it=v.begin();it!=v.end();++it) it=v.erase(it);
C++
1
2
for(it=v.begin();it!=v.end(); )
   it=v.erase(it);
maksqwe
4 / 3 / 1
Регистрация: 29.03.2012
Сообщений: 11
08.09.2013, 19:00     Удаление элемента из вектора #3
Читаем доки.
Функция erase() возвращает указатель на следующий после удаленного элемент. После чего вы успешно перескакиваете его (++it) и вуаля после 2 итерации с 3мя элементами итератор указывает на хз шо.

Работающий вариант должен быть что-то типа такого:
C++
1
2
3
4
5
vector<int>::iterator it = v.begin();
cout <<"v.size()= "<<v.size()<<endl;
while (it!=v.end()) {
    it = v.erase(it);
}
Проверьте код, должен работать.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.09.2013, 19:04     Удаление элемента из вектора #4
ninja2, кстати, цикл довольно бессмысленный, есть же clear().
UranFlex
131 / 129 / 21
Регистрация: 25.05.2013
Сообщений: 233
08.09.2013, 19:05     Удаление элемента из вектора #5
1 ) Используешь итератор для условия завершения цикла и в цикле же его меняешь. Так не нужно делать.
C++
1
it=v.erase(it);
2) Даже если сделать
C++
1
 v.erase(it)
то полчается изменяешь вектор, который перебираешь в цикле поэлементно - так тоже не стоит делать.

3) Судя по циклу - ты пытался удалить все элементы вектора.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
 
int main() {
    vector < int > v( 3, 4 ); // три элемента равные 4
 
    cout << "v.size()= " << v.size() << endl;
    v.clear(); // удалить все элементы вектора 
    cout << "v.size()= " << v.size() << endl;
    return 0;
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.09.2013, 19:06  [ТС]     Удаление элемента из вектора #6
gray_fox, это кусок кода, мне нужно именно элементы из вектора удалять некоторые.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.09.2013, 19:07     Удаление элемента из вектора #7
Цитата Сообщение от ninja2 Посмотреть сообщение
gray_fox, это кусок кода, мне нужно именно элементы из вектора удалять некоторые.
Тогда remove\remove_if + erase
maksqwe
4 / 3 / 1
Регистрация: 29.03.2012
Сообщений: 11
08.09.2013, 19:09     Удаление элемента из вектора #8
Цитата Сообщение от UranFlex Посмотреть сообщение
то полчается изменяешь вектор, который перебираешь в цикле поэлементно - так тоже не стоит делать.
Почему не стоит? Просто человек лишний раз инкрементировал итератор, из-за этого и падение, а все остальное ок.

Цитата Сообщение от ninja2 Посмотреть сообщение
это кусок кода, мне нужно именно элементы из вектора удалять некоторые.
Скажем так, напиши что конкретно нужно удалять, попытаемся посоветовать толковую реализацию.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.09.2013, 19:11     Удаление элемента из вектора #9
ninja2, если хочешь цикл, то примерно так:
C++
1
2
3
4
5
6
7
for (it = v.begin(); it != v.end(); ) {
   if (condition) {
      it = v.erase(it);
   } else {
      ++it;
   }
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.09.2013, 19:11  [ТС]     Удаление элемента из вектора #10
Цитата Сообщение от gray_fox Посмотреть сообщение
Тогда remove\remove_if + erase
Не remove и remove_if вроде не подходят, мне нужно удалять одинаковые элементы, например vector c(3 4);
3 смежных элемента равны 4, после цикла должно получится один элемент c[0]=4; Просто удалить нужно одинаковые смежные элементы.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.09.2013, 19:13     Удаление элемента из вектора #11
Цитата Сообщение от ninja2 Посмотреть сообщение
Не remove и remove_if вроде не подходят, мне нужно удалять одинаковые элементы, например vector c(3 4);
3 смежных элемента равны 4, после цикла должно получится один элемент c[0]=4; Просто удалить нужно одинаковые смежные элементы.
unique + erase
UranFlex
131 / 129 / 21
Регистрация: 25.05.2013
Сообщений: 233
08.09.2013, 19:27     Удаление элемента из вектора #12
ninja2, это хотел?
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
 
void PrintVecInt( vector < int >& ); // функция печати вектора
 
int main() {
    vector < int > v( 3, 4 ); // три элемента равные 4
 
    for ( int i = 0; i < 10; ++i )
        v.push_back( 5 ); // добавили еще 10 элементов равных 5
 
    PrintVecInt( v );
    v.erase( unique( v.begin(), v.end() ), v.end() ); // удалили все дубликаты
    PrintVecInt( v );
 
    return 0;
}
 
void PrintVecInt( vector < int >& vec ) {
    for ( vector < int >::iterator it = vec.begin(); it != vec.end(); ++it )
        cout << ( *it ) << " ";
    cout << endl;
}
maksqwe
4 / 3 / 1
Регистрация: 29.03.2012
Сообщений: 11
08.09.2013, 19:45     Удаление элемента из вектора #13
Если нужно удалить только лишние смежные дубли то:

C++
1
2
3
4
5
6
7
8
9
10
int prev = -1; // то число которое не попадется в контейнере... хотя можно и без него, нужно для первой проверки
while (it!=v.end()) {
    if (prev == *it) {
        it = v.erase(it);
    }
    else {
        prev = *it;
        ++it;
    }
}
то есть иммем на входе: (1, 2, 2, 2, 3, 3)
на выходе получим: (1, 2, 3)
Думаю как раз это имел ввиду.

P.S. давно с stl контейнерами не имел дело, Qt расслабляет

Добавлено через 11 минут
Обновленный вариант.

C++
1
2
3
4
5
6
7
8
9
10
int prev;
while (it!=v.end()) {
    if (it != v.begin() && prev == *it) {
        it = v.erase(it);
    }
    else {
        prev = *it;
        ++it;
    }
}
Добавлено через 5 минут
Так что, решили проблему твою? Если да, своим способом, напиши каким, или способом из этой темы?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.09.2013, 20:16  [ТС]     Удаление элемента из вектора #14
Цитата Сообщение от maksqwe Посмотреть сообщение
Так что, решили проблему твою? Если да, своим способом, напиши каким, или способом из этой темы?
Да решили, unique воспользовался и просто пробовал в цикле удалять.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2013, 20:25     Удаление элемента из вектора
Еще ссылки по теме:

C++ Удаление элемента из вектора
C++ Удаление элемента вектора

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

Или воспользуйтесь поиском по форуму:
maksqwe
4 / 3 / 1
Регистрация: 29.03.2012
Сообщений: 11
08.09.2013, 20:25     Удаление элемента из вектора #15
Отличное решение, согласен, вообще забыл про unique в stl Вот так и пишутся велосипеды.
Yandex
Объявления
08.09.2013, 20:25     Удаление элемента из вектора
Ответ Создать тему
Опции темы

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