Как удалить элемент из вектора c
Перейти к содержимому

Как удалить элемент из вектора c

  • автор:

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

Чтобы стереть элементы вектора по значению до С++ 20 необходимо:

#include #include using namespace std; int main() < vectordata< 99, 0, 578, 0, 258, 0, 84759>; cout cout cout

В C++20 есть функция std::erase(), которая позволяет стереть элемент вектора по значению.

#include #include using namespace std; int main() < system("chcp 1251>nul»); vector data< 5, 0, 10, 0, 12, 5, 74, 5 >; cout cout cout

Стереть элемент вектора по индексу

Стандартным решением для удаления элемента вектора является использование std::vector::erase(). Чтобы удалить элемент из вектора по его индексу, мы можем использовать арифметику указателя, как показано ниже:

#include #include #include #include using namespace std; template void remove(vector& v, size_t index) < v.erase(v.begin() + index); >int main() < vectordata = < 15, 28, 54, 32, 99 >; int index = 2; // 54 cout remove(data, index); cout << "\n\n\t\t"; copy(data.begin(), data.end(), ostream_iterator(cout, " ")); cout

В качестве альтернативы мы можем использовать std::advance() стандартный алгоритм для продвижения итератора на заданные позиции, чтобы указать на нужный индекс.

#include #include #include #include using namespace std; template void remove(vector& v, size_t index) < auto it = v.begin(); advance(it, index); v.erase(it); >int main() < vectordata = < 17, 2054, 34, 499, 51, 89, 387 >; int index = 4; //51 cout remove(data, index); cout << "\n\n\t\t"; copy(data.begin(), data.end(), ostream_iterator(std::cout, " ")); cout

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

Стандартное решение для условного удаления элементов вектора:

#include #include #include #include using namespace std; int main() < vectordata= < 11, 32, 43, 44, 15, 77, 20 >; cout data.erase(remove_if(data.begin(), data.end(), [](const int& x) ), data.end()); cout << "\n\n\t\t"; copy(data.begin(), data.end(), ostream_iterator(cout, " ")); cout

Начиная с C++20, мы можем использовать std::erase_if() алгоритм, который стирает все элементы из вектора, удовлетворяющего предоставленному предикату. Он определен в заголовке

#include #include #include #include using namespace std; int main() < vectordata< "vova","vita","vasq","vova","luna","vita" >; cout cout ); copy(data.begin(), data.end(), ostream_iterator(cout, » «)); cout

Универсальный метод для условного стирания элементов вектора.

#include #include #include using namespace std; class num < int m_number = 0; public: void setnum(int num) < m_number = num; >int getnum() const < return m_number; >>; void if_less_erase(vector& mydata, int less) < vectortmpdata; for (int i = 0; i < mydata.size(); i++) < if (mydata[i].getnum() >less) tmpdata.emplace_back(mydata[i]); > mydata.clear(); for (int i = 0; i < tmpdata.size(); i++) < mydata.emplace_back(tmpdata[i]); >> int main() < random_device rd; mt19937 gen(rd()); uniform_int_distribution<>rside(100, 1000); vector data; for (int i=0;i <10;i++) < data.emplace_back(num()); data[i].setnum(rside(gen)); >cout if_less_erase(data, 500); cout cout

Удаление элемента из vector

Author24 — интернет-сервис помощи студентам

Удаление элемента из vector
Здорова! Пытаюсь удалить элемент из vector<string>, но чото ошибку выдает и я вообще не пойму что.

Удаление элемента из std::vector<>
— Здравствуйте завсегдатаи! Подскажите пожалуйста, можно ли из STL-ского вектора std::vector<int>.

Вставка (с указанием положения) и удаление элемента в vector
Помогите сделать вставку с указанием положения #include <iostream> #include <vector> #include.

Удаление элемента из вектора ( std::vector )
Здравствуйте! У меня возникла проблема во время удаления элементов, значения которых не.

Удаление элемента std::vector C++

В случае, когда я пытаюсь удалить элемент, на который указывает итератор начала вектора, ничего не происходит и элемент выводится в обоих случаях и имеет один адрес. Если же я пытаюсь удалить элемент, указанный в коде, то программа крашится в рантайме:

Process finished with exit code -1073740940 (0xC0000374)

Видимо, я чего то не понимаю в работе с элементами по указателю. Подскажите, пожалуйста, как в итоге мне удалить элемент? Конкретизирую свой вопрос, я спросил немного не о том. Скажите, пожалуйста, что конкретно не так здесь:

for (int i = 0; i < currentRoom->getLoot().size(); ++i) < if (currentRoom->getLoot()[i]->getName() == item) if (currentRoom->getLoot()[i]->getPickable()) < inventory.push_back(currentRoom->getLoot()[i]); currentRoom->getLoot().erase(currentRoom->getLoot().begin() + i); return 0;> 

На строке с erase приложение завершается с ошибкой

Process finished with exit code -1073740940 (0xC0000374)

Элемент, который я хочу удалить точно присутствует в векторе в момент удаления.
Отслеживать
user361068
задан 29 июл 2018 в 12:10
37 1 1 золотой знак 1 1 серебряный знак 7 7 бронзовых знаков
а почему вы выводите 0 элемент, а удаляете 1?
29 июл 2018 в 12:18
@pavel, это просто был метод «тыка», изначально я удалял первый
29 июл 2018 в 12:31
А что возвращает ваш getLoot()? Дайте угадаю: объект std::vector?
29 июл 2018 в 12:43
@AndrejLevkovitch да, std::vector
29 июл 2018 в 12:44

И как это по вашему должно работать? Вы же возвращаете временный объект — даже если у вас и произойдет удаление (а в данном случае это невозможно), то на начальный объект это никак не повлияет.

29 июл 2018 в 12:46

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Естественно программа крашится, так как вы пытаетесь удалить элемент, которого не существует, так как в данном случае у вас вектор состоит только из одного элемента. Если вы хотите удалить этот единственный элемент, то нужно убрать 1 из вашего же примера:

vector.erase(vector.begin()); 

В этом случае программа не будет крашится, а элемент удалится.

PS по поводу того, что элемент все равно отображается — в этом ничего удивительного, так как удаление элемента — это не его затирание. Вам следует поближе познакомится с памятью и понять как происходит занесение данных в память и их удаление. В кратце скажу: при «удалении» элемента ячейки памяти в которой находится элемент просто помечаются как вакантные. Они все еще существуют, но вот сохранение данных в них не гарантировано. В случае вектора — тоже самое. Ваша удаленная ячейка все еще будет содержать тот же указатель пока не будет перезаписана при следующем добавлении элемента.

Как удалить элемент из вектора c

Для добавления элементов в вектор применяется функция push_back() , в которую передается добавляемый элемент:

#include #include int main() < std::vectornumbers; // пустой вектор numbers.push_back(5); numbers.push_back(3); numbers.push_back(10); for(int n : numbers) cout << n << "\t"; // 5 3 10 std::cout

Векторы являются динамическими структурами в отличие от массивов, где мы скованы его заданым размером. Поэтому мы можем динамически добавлять в вектор новые данные.

Функция emplace_back() выполняет аналогичную задачу — добавляет элемент в конец контейнера:

std::vector numbers< 1, 2, 3, 4, 5 >; numbers.emplace_back(8); // numbers = < 1, 2, 3, 4, 5, 8 >;

Добавление элементов на определенную позицию

Ряд функций позволяет добавлять элементы на определенную позицию.

  • emplace(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos
  • insert(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos, аналогично функции emplace
  • insert(pos, n, value) : вставляет n элементов value начиная с позиции, на которую указывает итератор pos
  • insert(pos, begin, end) : вставляет начиная с позиции, на которую указывает итератор pos, элементы из другого контейнера из диапазона между итераторами begin и end
  • insert(pos, values) : вставляет список значений начиная с позиции, на которую указывает итератор pos
std::vector numbers< 1, 2, 3, 4, 5 >; auto iter = numbers.cbegin(); // константный итератор указывает на первый элемент numbers.emplace(iter + 2, 8); // добавляем после второго элемента numbers = < 1, 2, 8, 3, 4, 5>;
std::vector numbers1< 1, 2, 3, 4, 5 >; auto iter1 = numbers1.cbegin(); // константный итератор указывает на первый элемент numbers1.insert(iter1 + 2, 8); // добавляем после второго элемента //numbers1 = < 1, 2, 8, 3, 4, 5>; std::vector numbers2 < 1, 2, 3, 4, 5 >; auto iter2 = numbers2.cbegin(); // константный итератор указывает на первый элемент numbers2.insert(iter2 + 1, 3, 4); // добавляем после первого элемента три четверки //numbers2 = < 1, 4, 4, 4, 2, 3, 4, 5>; std::vector values < 10, 20, 30, 40, 50 >; std::vector numbers3 < 1, 2, 3, 4, 5 >; auto iter3 = numbers3.cbegin(); // константный итератор указывает на первый элемент // добавляем после первого элемента три первых элемента из вектора values numbers3.insert(iter3 + 1, values.begin(), values.begin() + 3); //numbers3 = < 1, 10, 20, 30, 2, 3, 4, 5>; std::vector numbers4 < 1, 2, 3, 4, 5 >; auto iter4 = numbers4.cend(); // константный итератор указывает на позицию за последним элементом // добавляем в конец вектора numbers4 элементы из списка < 21, 22, 23 >numbers4.insert(iter4, < 21, 22, 23 >); //numbers4 = < 1, 2, 3, 4, 5, 21, 22, 23>;

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

Если необходимо удалить все элементы вектора, то можно использовать функцию clear :

std::vector v < 1,2,3,4 >; v.clear();

Функция pop_back() удаляет последний элемент вектора:

std::vector v < 1,2,3,4 >; v.pop_back(); // v =

Если нужно удалить элемент из середины или начала контейнера, применяется функция std::erase() , которая имеет следующие формы:

  • erase(p) : удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент
  • erase(begin, end) : удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент

std::vector numbers1 < 1, 2, 3, 4, 5, 6 >; auto iter = numbers1.cbegin(); // указатель на первый элемент numbers1.erase(iter + 2); // удаляем третий элемент // numbers1 = < 1, 2, 4, 5, 6 >std::vector numbers2 = < 1, 2, 3, 4, 5, 6 >; auto begin = numbers2.cbegin(); // указатель на первый элемент auto end = numbers2.cend(); // указатель на последний элемент numbers2.erase(begin + 2, end — 1); // удаляем с третьего элемента до последнего // numbers2 =

Также начиная со стандарта С++20 в язык была добавлена функция std::erase() . Она не является частью типа vector. В качестве первого параметра она принимает вектор, а в качестве второго — элемент, который надо удалить:

std::vector numbers3 < 1, 2, 3, 1, 5, 6 >; std::erase(numbers3, 1); // numbers3 =

В данном случае удаляем из вектора numbers3 все вхождения числа 1.

Размер вектора

С помощью функции size() можно узнать размер вектора, а с помощью функции empty() проверить, путой ли вектор:

#include #include int main() < std::vectornumbers; if(numbers.empty()) std::cout

С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:

  • resize(n) : оставляет в векторе n первых элементов. Если вектор содержит больше элементов, то его размер усекается до n элементов. Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию
  • resize(n, value) : также оставляет в векторе n первых элементов. Если размер вектора меньше n, то добавляются недостающие элементы со значением value

std::vector numbers1 < 1, 2, 3, 4, 5, 6 >; numbers1.resize(4); // оставляем первые четыре элемента — numbers1 = numbers1.resize(6, 8); // numbers1 =

Важно учитывать, что применение функции resize может сделать некорректными все итераторы, указатели и ссылки на элементы.

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

Функция assign() позволяет заменить все элементы вектора определенным набором:

std::vector langs = < "Java", "JavaScript", "C">; langs.assign(4, «C++»); // langs =

В данном случае элементы вектора заменяются набором из четырех строк «C++».

Также можно передать непосредственно набор значений, который заменит значения вектора:

std::vector langs< "Java", "JavaScript", "C">; langs.assign(< "C++", "C#", "C">); // langs =

Еще одна функция — swap() обменивает значения двух контейнеров:

std::vector clangs < "C++", "C#", "Java" >; std::vector ilangs < "JavaScript", "Python", "PHP">; clangs.swap(ilangs); // clangs = < "JavaScript", "Python", "PHP">; for(std::string lang : clangs)

Сравнение векторов

Векторы можно сравнивать — они поддерживают все операции сравнения: , =, ==, !=. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях. Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:

std::vector v1 ; std::vector v2 ; std::vector v3 ; bool v1v2 = v1 == v2; // true bool v1v3 = v1 != v3; // true bool v2v3 = v2 == v3; // false

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *