Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Алгоритмы STL Удаление элементов в векторе

29.09.2015, 14:37. Показов 3039. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Банальный вопрос. vector<int> В нем разные числа могут повторяться.
Хочу удалить заданное значение, полностью исключить его из вектора.

пробовал вот так
C++
1
v.erase(remove_if(v.begin(), v.end(), [&value](int x){return x==value;}), v.end());
и так
C++
1
v.erase(v.remove(v.begin(),v.end(),value),v.end());
Так не удаляет всех элементов. Как это делают в классике STL?

Не по теме:

чем современнее тем лучше.



v = 1,2,3,4,7,5,1,1
value=1
v = 2,3,4,7,5 //Единицы из вектора исключились

На алгоритмах. Если можно без обычных циклов (for , while).
На векторе, не на других контейнерах.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.09.2015, 14:37
Ответы с готовыми решениями:

Удаление повторяющихся элементов в векторе
Нужно перегрузить унарный оператор ~ что бы он удалял повторяющиеся элементы в векторе vector&amp; operator ~ () { if (count...

Перемещение и удаление элементов в векторе
Eсть такой код: vector&lt;int&gt; v = {-3, -5, -6, 1, 2, 3}; for (size_t i = 0; i != v.size(); i++) { if (v &gt; 0) { ...

stl, удаление элементов в list
Всем доброго времени суток! прошу помочь в решении задачи: Из числовой последовательности найти удалить все элементы, лежащие в...

14
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
29.09.2015, 14:48
daslex, код лучше покажите.
У меня такой код прекрасно удаляет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>     
#include <algorithm>    
#include <vector>
 
int main () {
int value = 1;  
  std::vector<int> vec=  {1,2,3,4,7,5,1,1};
  vec.erase(std::remove(vec.begin(),vec.end(),value),vec.end());
  for(const auto &el:vec)
    std::cout<<el<<" ";
 
  return 0;
}
http://ideone.com/HhQ5Wx
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
29.09.2015, 15:48  [ТС]
Все норм работает. Это я чего-то туплю. Спасибо.

Добавлено через 46 минут
Ну коли я все равно не понимаю чего происходит, то просьба пояснить.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main()
{
    vector<int> vec={1,2,3,4,7,5,1,1};
    auto min=min_element(vec.begin(),vec.end());
 
     for (auto &i:vec) cout<<i<<"  ";
     cout<<"\n";
 
    vec.erase(std::remove(vec.begin(),vec.end(),*min),vec.end());
    for (auto &i:vec) cout<<i<<"  ";
}
Я полагал, что при разыменовании min, я получаю целочисленную int.

Мне не надо пояснять, что я могу привести к int или добавить доп. переменные. Меня больше интересует сам *min. Что это?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
29.09.2015, 16:24
Лучший ответ Сообщение было отмечено daslex как решение

Решение

Цитата Сообщение от daslex Посмотреть сообщение
Я полагал, что при разыменовании min, я получаю целочисленную int.
Так и есть.

Цитата Сообщение от daslex Посмотреть сообщение
Меня больше интересует сам *min. Что это?
min - это итератор. *min - операция * у итератора. Дает ссылку на значение, на которое итератор указывает.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
29.09.2015, 16:31  [ТС]
А почему тогда алгоритм удаляет только первое вхождение?

Добавлено через 1 минуту
В то время как если это чистый int, удаляет все значения.

Добавлено через 3 минуты
А все. понял.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
29.09.2015, 16:32
daslex, используй std::remove_if.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
29.09.2015, 16:39  [ТС]
Да не все. норм. И так работает. Значение по ссылке убивается, он ее и не находит потом. Во.

Добавлено через 5 минут
Хотя мне непонятно. Что-то я не допонял. Если так, то почему так исключает все.
C++
1
vec.erase(std::remove(vec.begin(),vec.end(),(int)*min),vec.end());
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
29.09.2015, 16:46
Цитата Сообщение от daslex Посмотреть сообщение
А почему тогда алгоритм удаляет только первое вхождение?
UB.
std::remove сдвигает элементы, но сравниваемый элемент - это один из тех, с которыми работает алгоритм.
Когда ты делаешь приведение типа, то ты создаешь временный объект - rvalue, который существует независимо от контейнера и поведение чинится.

Добавлено через 40 секунд
Цитата Сообщение от daslex Посмотреть сообщение
Если так, то почему так исключает все.
Ответил в предыдущем сообщении.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
А все. понял.
Да, у меня медленный интернет на работе :)

1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
29.09.2015, 16:49
daslex, смотри:
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
#include <iostream>
#include <algorithm>
 
int max_elem = 0;
int min_elem = 0;
 
bool should_be_removed(int i)
{
    return (i == max_elem || i == min_elem);
}
 
int main()
{
    int myints[] = {1, 2, 3, 1, 5, 6, 9, 8, 9, 4, 7};
 
    // bounds of range:
    int* pbegin = myints;
    int* pend = myints + sizeof(myints) / sizeof(int);
 
    max_elem = *std::max_element(pbegin, pend);
    min_elem = *std::min_element(pbegin, pend);
 
    pend = std::remove_if(pbegin, pend, should_be_removed);
 
    std::cout << "the range contains:";
    for (int* p = pbegin; p! = pend; ++p)
    std::cout << ' ' << *p;
    std::cout << '\n';
 
    return 0;
}
1
29.09.2015, 16:52  [ТС]

Не по теме:

gru74ik, Меня не как делать, а "что за "нафиг"" интересовало.
ты усложняешь простое

и вот так
int max_elem = 0;
int min_elem = 0;

хорошо, но все-таки не очень удачно для контейнеров.

0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
29.09.2015, 16:53
Цитата Сообщение от daslex Посмотреть сообщение
ты усложняешь простое
ОК. Нет, так нет.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
29.09.2015, 17:00
gru74ik, кстати, range for и с C-массивами умеет работать:
C++
1
2
    for(const auto &el: myints)
        std::cout << ' ' << el;
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
29.09.2015, 17:10
S_el, благодарю. Классная вещь!

Добавлено через 3 минуты
Цитата Сообщение от S_el Посмотреть сообщение
for(const auto &el: myints)
Блин, опять забыл я const в функции show().
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
29.09.2015, 17:18
Цитата Сообщение от gru74ik Посмотреть сообщение
Блин, опять забыл я const в функции show().
А я как-то здесь на форуме прочел про правило:
"по-возможности используй const"
с тех пор и следую.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
29.09.2015, 17:20
Цитата Сообщение от S_el Посмотреть сообщение
А я как-то здесь на форуме прочел про правило:
"по-возможности используй const"
S_el, я тоже стараюсь. Но иногда от усталости включается ovosсh mode on - башка тупая становится, начинаю элементарные вещи пропускать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.09.2015, 17:20
Помогаю со студенческими работами здесь

Удаление элементов из односвязного списка (STL)
Здравствуйте, уважаемые форумчане! Помогите, пожалуйста, с контейнером forward_list&lt;int&gt; (именно с ним). Совсем запутался. Могу...

Удаление элементов вектора с использованием итератора в STL
Задача: создать программу, в которую пользователь может ввести свой список из 50 названий игр, а потом при желании удалить выбранную игру....

Организовать find в векторе через STL!!!
Написал через вектор STL некий контейнер заполнил его данными. Написал сортировку и вывод всех значений через вспомогательные обьекты....

Функторы и алгоритмы stl
Добрый день! Интересует такой вопрос. Я хочу, используя стандартный алгоритм стл for_each() и функтор, определить наибольший элемент в...

STL алгоритмы сортировки
Здрасти. В STL есть алгоритмы sort - упорядочивает последовательность и stable_sort - упорядочивает последовательность, не меняя...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru