Удаление элементов из вектора в C++
Стереть элемент из вектора по значению
Чтобы стереть элементы вектора по значению до С++ 20 необходимо:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> data{ 99, 0, 578, 0, 258, 0, 84759}; cout << "\n\n\t\t"; for (const auto& num : data) { cout << num << '\t'; } cout << "\n\n\t\t"; const auto deleteObject = remove(data.begin(), data.end(), 0); data.erase(deleteObject, data.end()); for (const auto& num : data) { cout << num << '\t'; } cout <<"\n\n\t\t"; system("pause"); }
В C++20 есть функция std::erase(), которая позволяет стереть элемент вектора по значению.
#include <iostream> #include <vector> using namespace std; int main() { system("chcp 1251>nul"); vector<int> data{ 5, 0, 10, 0, 12, 5, 74, 5 }; cout << "\n\n\t\t"; for (const auto& num : data) { cout << num << '\t'; } cout << "\n\n\t\t"; const auto number_of_deletions = erase(data, 5); cout << " Количество удалённых элементов = "<< number_of_deletions<<"\n\n\t\t"; for (const auto& num : data) { cout << num << '\t'; } cout << "\n\n\t\t"; system("pause"); }
Стереть элемент вектора по индексу
Стандартным решением для удаления элемента вектора является использование std::vector::erase(). Чтобы удалить элемент из вектора по его индексу, мы можем использовать арифметику указателя, как показано ниже:
#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; template <typename T> void remove(vector<T>& v, size_t index) { v.erase(v.begin() + index); } int main() { vector<int> data = { 15, 28, 54, 32, 99 }; int index = 2; // 54 cout << "\n\n\t\t"; for (const auto& num : data) { cout << num<<" "; } remove(data, index); cout << "\n\n\t\t"; copy(data.begin(), data.end(), ostream_iterator<int>(cout, " ")); cout << "\n\n"; system("pause"); return 0; }
В качестве альтернативы мы можем использовать std::advance() стандартный алгоритм для продвижения итератора на заданные позиции, чтобы указать на нужный индекс.
#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; template <typename T> void remove(vector<T>& v, size_t index) { auto it = v.begin(); advance(it, index); v.erase(it); } int main() { vector<int> data = { 17, 2054, 34, 499, 51, 89, 387 }; int index = 4; //51 cout << "\n\n\t\t"; for (const auto& num : data) { cout << num << " "; } remove(data, index); cout << "\n\n\t\t"; copy(data.begin(), data.end(), ostream_iterator<int>(std::cout, " ")); cout << "\n\n"; system("pause"); return 0; }
Условное удаление элементов вектора
Стандартное решение для условного удаления элементов вектора:
#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; int main() { vector<int> data= { 11, 32, 43, 44, 15, 77, 20 }; cout << "\n\n\t\t"; for (const auto& num : data) { cout << num <<" "; } data.erase(remove_if(data.begin(), data.end(), [](const int& x) {return x % 2 == 0;}), data.end()); cout << "\n\n\t\t"; copy(data.begin(), data.end(), ostream_iterator<int>(cout, " ")); cout << "\n\n\t\t"; system("pause"); return 0; }
Начиная с C++20, мы можем использовать std::erase_if() алгоритм, который стирает все элементы из вектора, удовлетворяющего предоставленному предикату. Он определен в заголовке <vector>
#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; int main() { vector<string> data{ "vova","vita","vasq","vova","luna","vita" }; cout << "\n\n\t\t"; for (const auto& num : data) { cout << num <<" "; } cout << "\n\n\t\t"; erase_if(data, [](auto str) { return str == "vova"; }); copy(data.begin(), data.end(), ostream_iterator<string>(cout, " ")); cout << "\n\n\t\t"; system("pause"); }
Универсальный метод для условного стирания элементов вектора.
#include <iostream> #include <vector> #include<random> 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<num>& mydata, int less) { vector<num> tmpdata; 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<num> data; for (int i=0;i<10;i++) { data.emplace_back(num()); data[i].setnum(rside(gen)); } cout << "\n\n\t\t"; for (const auto& num : data) { cout << num.getnum() <<" "; } if_less_erase(data, 500); cout << "\n\n\t\t"; for (const auto& num : data) { cout << num.getnum() << " "; } cout << "\n\n\t\t"; system("pause"); }