Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041

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

08.09.2013, 18:39. Показов 5658. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2013, 18:39
Ответы с готовыми решениями:

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

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

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

14
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
08.09.2013, 19:00
Цитата Сообщение от 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
4 / 3 / 0
Регистрация: 29.03.2012
Сообщений: 11
08.09.2013, 19:00
Читаем доки.
Функция 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
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
08.09.2013, 19:04
ninja2, кстати, цикл довольно бессмысленный, есть же clear().
1
134 / 132 / 51
Регистрация: 25.05.2013
Сообщений: 233
08.09.2013, 19:05
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
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
08.09.2013, 19:06  [ТС]
gray_fox, это кусок кода, мне нужно именно элементы из вектора удалять некоторые.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
08.09.2013, 19:07
Цитата Сообщение от ninja2 Посмотреть сообщение
gray_fox, это кусок кода, мне нужно именно элементы из вектора удалять некоторые.
Тогда remove\remove_if + erase
0
4 / 3 / 0
Регистрация: 29.03.2012
Сообщений: 11
08.09.2013, 19:09
Цитата Сообщение от UranFlex Посмотреть сообщение
то полчается изменяешь вектор, который перебираешь в цикле поэлементно - так тоже не стоит делать.
Почему не стоит? Просто человек лишний раз инкрементировал итератор, из-за этого и падение, а все остальное ок.

Цитата Сообщение от ninja2 Посмотреть сообщение
это кусок кода, мне нужно именно элементы из вектора удалять некоторые.
Скажем так, напиши что конкретно нужно удалять, попытаемся посоветовать толковую реализацию.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
08.09.2013, 19:11
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
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
08.09.2013, 19:11  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Тогда remove\remove_if + erase
Не remove и remove_if вроде не подходят, мне нужно удалять одинаковые элементы, например vector c(3 4);
3 смежных элемента равны 4, после цикла должно получится один элемент c[0]=4; Просто удалить нужно одинаковые смежные элементы.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
08.09.2013, 19:13
Цитата Сообщение от ninja2 Посмотреть сообщение
Не remove и remove_if вроде не подходят, мне нужно удалять одинаковые элементы, например vector c(3 4);
3 смежных элемента равны 4, после цикла должно получится один элемент c[0]=4; Просто удалить нужно одинаковые смежные элементы.
unique + erase
2
134 / 132 / 51
Регистрация: 25.05.2013
Сообщений: 233
08.09.2013, 19:27
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
4 / 3 / 0
Регистрация: 29.03.2012
Сообщений: 11
08.09.2013, 19:45
Если нужно удалить только лишние смежные дубли то:

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
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
08.09.2013, 20:16  [ТС]
Цитата Сообщение от maksqwe Посмотреть сообщение
Так что, решили проблему твою? Если да, своим способом, напиши каким, или способом из этой темы?
Да решили, unique воспользовался и просто пробовал в цикле удалять.
0
4 / 3 / 0
Регистрация: 29.03.2012
Сообщений: 11
08.09.2013, 20:25
Отличное решение, согласен, вообще забыл про unique в stl Вот так и пишутся велосипеды.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.09.2013, 20:25
Помогаю со студенческими работами здесь

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

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

Удаление элемента из вектора
После ввода данных в консоль, ничего не выводит. В конце процессор возвращает ошибку -107374189(0xC0000005). Я так понимаю это из-за...

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

Удаление элемента из вектора пользовательского класса
Помогите, пожалуйста. Не могут понять, что я упускаю. При удалении элемента из вектора происходит краш. class some_class { public:...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru