Vector c удалить элемент
Я смотрел документацию API для STL vector и заметил, что в классе vector нет метода, который позволял бы удалить элемент с определенным значением. Это похоже на общую операцию, и кажется странным, что для этого нет встроенного способа.
std::remove фактически не стирает элемент из контейнера, но возвращает новый конечный итератор, который можно передать в container_type::erase чтобы сделать реальное удаление дополнительных элементов, которые теперь находятся в конце контейнера:
Если вы хотите удалить an пункт, следующее будет немного более эффективным.
или вы можете избежать накладных расходов на перемещение элементов, если заказ не имеет для вас значения:
используйте глобальный метод std::remove с итератором begin и end, а затем используйте std:: vector.стереть, чтобы удалить элементы.
спасибо Джиму Баку за указание на мою ошибку.
другие ответы охватывают, как это сделать хорошо, но я думал, что я также укажу, что это не очень странно, что это не в векторном API: это неэффективный, линейный поиск по вектору для значения, а затем куча копирования, чтобы удалить его.
Если вы делаете эту операцию интенсивно, по этой причине может быть стоит рассмотреть std::set.
если у вас есть несортированный вектор, то вы можете просто поменять местами с последним элементом вектора, а затем resize() .
с заказанным контейнером вам будет лучше всего с std::vector::erase() . Обратите внимание, что есть std::remove() определена в <algorithm> , но на самом деле это не стирание. (Внимательно прочитайте документацию).
см. также std:: remove_if чтобы иметь возможность использовать предикат.
вот пример из приведенной выше ссылки:
более коротким решением (которое не заставляет вас повторять имя вектора 4 раза) было бы использование Boost:
Если вы хотите сделать это без лишних включает в себя:
есть два способа, с помощью которых вы можете использовать, чтобы стереть элемент особенно. давайте возьмем вектор
1) не эффективный способ : хотя это кажется довольно эффективным, но это не потому, что функция стирания удаляет элементы и сдвигает все элементы влево на 1. таким образом, его сложность будет O (n^2)
2) эффективный способ (рекомендуется ) : он также известен как СТЕРЕТЬ-УДАЛИТЬ идиомы .
- std:: remove преобразует заданный диапазон в Диапазон со всеми элементами, которые сравниваются не равными заданному элементу, смещенному в начало контейнера.
- таким образом, на самом деле не удаляйте сопоставленные элементы. Он просто сдвинул несоответствие к началу и дает итератору новый допустимый конец. Это просто требует o (n) сложности.
вывод алгоритма удаления:
в качестве возвращаемого типа из remove является итератором для нового конца этого диапазона.
теперь используйте функцию стирания вектора для удаления элементов из нового конца в старый конец вектора. Это требует O(1) времени.
правильный ответ должен быть 1 3 4 5 6 7
компилятор выдает 1 2 6 7
в чем проблема?
Удаление элемента из вектора
void DelElement() < if (this->v1.empty()) < cout << "Вектор пуст!" << endl; _getch(); >.
Удаление элемента вектора
Приветствую пользователей форума. Возникает ошибка при попытке удаления элемента вектора. При.
Удаление элемента вектора
Здравствуйте, мне нужно удалить из вектора элементы, которые делятся на 2 без остатка. Я ввожу 10.
Удаление элемента из вектора
Вектор состоит из объектов класса schedule, требуется удалить элементы, где base.group = gr.
Удаление элемента из вектора
void DelElement() < if (this->v1.empty()) < cout << "Вектор пуст!" << endl; _getch(); >.
Удаление элемента вектора
Приветствую пользователей форума. Возникает ошибка при попытке удаления элемента вектора. При.
Удаление элемента вектора
Здравствуйте, мне нужно удалить из вектора элементы, которые делятся на 2 без остатка. Я ввожу 10.
Читаем доки.
Функция erase() возвращает указатель на следующий после удаленного элемент. После чего вы успешно перескакиваете его (++it) и вуаля после 2 итерации с 3мя элементами итератор указывает на хз шо.
Работающий вариант должен быть что-то типа такого:
то полчается изменяешь вектор, который перебираешь в цикле поэлементно - так тоже не стоит делать.
3) Судя по циклу - ты пытался удалить все элементы вектора.
Почему не стоит? Просто человек лишний раз инкрементировал итератор, из-за этого и падение, а все остальное ок.
это кусок кода, мне нужно именно элементы из вектора удалять некоторые. Скажем так, напиши что конкретно нужно удалять, попытаемся посоветовать толковую реализацию. Не remove и remove_if вроде не подходят, мне нужно удалять одинаковые элементы, например vector c(3 4);3 смежных элемента равны 4, после цикла должно получится один элемент c[0]=4; Просто удалить нужно одинаковые смежные элементы. Не remove и remove_if вроде не подходят, мне нужно удалять одинаковые элементы, например vector c(3 4);
3 смежных элемента равны 4, после цикла должно получится один элемент c[0]=4; Просто удалить нужно одинаковые смежные элементы.
Если нужно удалить только лишние смежные дубли то:
то есть иммем на входе: (1, 2, 2, 2, 3, 3)
на выходе получим: (1, 2, 3)
Думаю как раз это имел ввиду.
P.S. давно с stl контейнерами не имел дело, Qt расслабляет
Добавлено через 11 минут
Обновленный вариант.
Так что, решили проблему твою? Если да, своим способом, напиши каким, или способом из этой темы? Так что, решили проблему твою? Если да, своим способом, напиши каким, или способом из этой темы? Да решили, unique воспользовался и просто пробовал в цикле удалять. Отличное решение, согласен, вообще забыл про unique в stl Вот так и пишутся велосипеды.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Удаление элемента из вектора
Вектор состоит из объектов класса schedule, требуется удалить элементы, где base.group = gr.
Удаление элемента из вектора
После ввода данных в консоль, ничего не выводит. В конце процессор возвращает ошибку.
Удаление элемента вектора в цикле.
Как правильно удалить элемент вектора в цикле? remove_if не подходит. Примерно вот такая структура.
Удаление элемента из вектора пользовательского класса
Помогите, пожалуйста. Не могут понять, что я упускаю. При удалении элемента из вектора происходит.
У меня есть std::vector, и я хочу удалить n-й элемент. Как мне это сделать?
чтобы удалить один элемент, вы можете сделать:
или, чтобы удалить более одного элемента за один раз:
метод erase на std:: vector перегружен, поэтому, вероятно, яснее вызвать
когда вы хотите стереть только один элемент.
на erase метод будет использоваться двумя способами:
удаление одного элемента:
удаление ряда элементов:
на самом деле erase функция работает для двух профилей:
удаление одного элемента
удаление ряда элементов
С std:: vec.begin () отмечает начало контейнера, и если мы хотим удалить I-й элемент в нашем векторе, мы можем использовать:
если присмотреться, ВЭК.begin () - это просто указатель на начальную позицию нашего вектора и добавление значение i к нему увеличивает указатель на позицию i, поэтому вместо этого мы можем получить доступ к указателю на I-й элемент по:
Итак, мы можем написать:
Если у вас есть неупорядоченный вектор, вы можете воспользоваться тем, что он неупорядочен, и использовать то, что я видел от Дэна Хиггинса в CPPCON
поскольку порядок списка не имеет значения, просто возьмите последний элемент в списке и скопируйте его поверх элемента, который вы хотите удалить, затем поп и удалить последний элемент.
Если вы работаете с большими векторами (размер > 100,000) и хотите удалить много элементов, я бы рекомендовал сделать что-то вроде этого:
код принимает каждое число в vec, которое не может быть разделено на 3, и копирует его в vec2. Впоследствии он копирует vec2 в vec. Это довольно быстро. Для обработки 20,000,000 элементов этот алгоритм занимает всего 0,8 сек!
Я сделал то же самое с методом стирания, и это занимает много и много времени:
чтобы удалить элемент, используйте следующий способ:
предыдущие ответы предполагают, что вы всегда подписанный индекс. К сожалению, std::vector использует size_type для индексации, и difference_type для арифметики итератора, поэтому они не работают вместе, если у вас есть" - Wconversion " и друзья включены. Это еще один способ ответить на вопрос, имея возможность обрабатывать как подписанные, так и неподписанные:
вот еще один способ сделать это,если вы хотите удалить элемент, найдя это со значением в векторе, вам просто нужно сделать это на векторе.
Читайте также: