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

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

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

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

08.09.2013, 18:39. Просмотров 1131. Ответов 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;
Вылетает окно и все.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2013, 18:39     Удаление элемента из вектора
Посмотрите здесь:

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 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!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 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
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.09.2013, 19:06  [ТС]     Удаление элемента из вектора #6
gray_fox, это кусок кода, мне нужно именно элементы из вектора удалять некоторые.
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 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!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 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
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!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 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
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     Удаление элемента из вектора
Еще ссылки по теме:

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

Удаление из вектора - C++
1)В программе используется вектор которых хранит объекты некоторого класса, можно ли удалить из его середины(любого произвольного места)...

Удаление из вектора - C++
#include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;algorithm&gt; using namespace std; void print(vector &lt;int&gt; randomNumbers); int main() ...

Удаление из вектора по индексу - C++
Добрий день, нуждаюсь в консультации. Пишу метод удаления из вектора по индексу, но наткнулся на то, что не могу найти нужный метод,...

Удаление элементов вектора - C++
как вызвать деструктор? почему не удаляется объект class a { public: a() { std::cout &lt;&lt; &quot;c&quot;; } ~a() { std::cout &lt;&lt;...


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

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

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