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

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

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

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

08.09.2013, 18:39. Просмотров 1203. Ответов 14
Метки нет (Все метки)

Здорова!

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

Удаление элемента вектора - C++
Здравствуйте, мне нужно удалить из вектора элементы, которые делятся на 2 без остатка. Я ввожу 10 элементов вектора с клавиатуры, плюс в...

Удаление элемента из вектора - C++
void DelElement() { if (this-&gt;v1.empty()) { cout &lt;&lt; &quot;Вектор пуст!&quot; &lt;&lt; endl; _getch(); } else { this-&gt;PrintElement(); ...

Удаление элемента из вектора - C++
подскажите пытаюсь удалить элемент из int вектора вот таким образом #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; ...

Удаление элемента вектора - C++
Приветствую пользователей форума. Возникает ошибка при попытке удаления элемента вектора. При сравнении необходимого имени (типа string) c...

Удаление элемента из вектора - C++
Вектор состоит из объектов класса schedule, требуется удалить элементы, где base.group = gr, программа вылетает на этом месте, помогите,...

Удаление элемента вектора в цикле. - C++
Как правильно удалить элемент вектора в цикле? remove_if не подходит. Примерно вот такая структура программы: struct Ex { char...

14
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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);
1
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);
}
Проверьте код, должен работать.
1
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
08.09.2013, 19:04 #4
ninja2, кстати, цикл довольно бессмысленный, есть же clear().
1
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;
}
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.09.2013, 19:06  [ТС] #6
gray_fox, это кусок кода, мне нужно именно элементы из вектора удалять некоторые.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
08.09.2013, 19:07 #7
Цитата Сообщение от ninja2 Посмотреть сообщение
gray_fox, это кусок кода, мне нужно именно элементы из вектора удалять некоторые.
Тогда remove\remove_if + erase
0
maksqwe
4 / 3 / 1
Регистрация: 29.03.2012
Сообщений: 11
08.09.2013, 19:09 #8
Цитата Сообщение от UranFlex Посмотреть сообщение
то полчается изменяешь вектор, который перебираешь в цикле поэлементно - так тоже не стоит делать.
Почему не стоит? Просто человек лишний раз инкрементировал итератор, из-за этого и падение, а все остальное ок.

Цитата Сообщение от ninja2 Посмотреть сообщение
это кусок кода, мне нужно именно элементы из вектора удалять некоторые.
Скажем так, напиши что конкретно нужно удалять, попытаемся посоветовать толковую реализацию.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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;
   }
}
0
ninja2
231 / 187 / 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; Просто удалить нужно одинаковые смежные элементы.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
08.09.2013, 19:13 #11
Цитата Сообщение от ninja2 Посмотреть сообщение
Не remove и remove_if вроде не подходят, мне нужно удалять одинаковые элементы, например vector c(3 4);
3 смежных элемента равны 4, после цикла должно получится один элемент c[0]=4; Просто удалить нужно одинаковые смежные элементы.
unique + erase
2
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;
}
1
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 минут
Так что, решили проблему твою? Если да, своим способом, напиши каким, или способом из этой темы?
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.09.2013, 20:16  [ТС] #14
Цитата Сообщение от maksqwe Посмотреть сообщение
Так что, решили проблему твою? Если да, своим способом, напиши каким, или способом из этой темы?
Да решили, unique воспользовался и просто пробовал в цикле удалять.
0
maksqwe
4 / 3 / 1
Регистрация: 29.03.2012
Сообщений: 11
08.09.2013, 20:25 #15
Отличное решение, согласен, вообще забыл про unique в stl Вот так и пишутся велосипеды.
0
08.09.2013, 20:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2013, 20:25
Привет! Вот еще темы с ответами:

Удаление [i][j] элемента из вектора типа string - C++
Добрый вечер! Пишу курсовую на тему &quot;Консольный текстовый редактор&quot;. На деле же я считываю построчно из файла в вектор типа string. Одна...

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

Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А - C++
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А на начало, а...

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


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

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

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