Удалить элемент из вектора по значению - С++ Если у меня vector<T> list Где каждый элемент в списке уникален, какой самый простой способ удаления элемента при условии, что я не знаю, включен ли он в список или нет? Я не знаю индекс элемента, и мне все равно, не он ли он в списке. Ответ 1 Вы можете использовать Erase-remove idiom для std::vector Цитата: std::vector<int> v; // fill it up somehow v.erase(std::remove(v.begin(), v.end(), 99), v.end()); // really remove all elements with value 99 Или, если вы уверены, что он уникален, просто перебирайте вектор и стирайте найденный элемент. Что-то вроде: for( std::vector<T>::iterator iter = v.begin(); iter != v.end(); ++iter ) { if( *iter == VALUE ) { v.erase( iter ); break; } } Ответ 2 Если вхождения уникальны, вы должны использовать std::set<T>, а не std::vector<T>. Это добавляет преимущества функции-члена erase, которая делает то, что вы хотите. Посмотрите, как использование правильного контейнера для задания дает вам более выразительные инструменты? #include <set> #include <iostream> int main() { std::set<int> notAList{1,2,3,4,5}; for (auto el : notAList) std::cout << el << ' '; std::cout << '\n'; notAList.erase(4); for (auto el : notAList) std::cout << el << ' '; std::cout << '\n'; } // 1 2 3 4 5 // 1 2 3 5 демо-версия Ответ 3 На основе ответа Кирилла вы можете использовать эту функцию в своем коде: template<typename T> inline void remove(vector<T> & v, const T & item) { v.erase(std::remove(v.begin(), v.end(), item), v.end()); } И используйте его вот так remove(myVector, anItem);
Ответ 1 Вы можете использовать Erase-remove idiom для std::vector Цитата: std::vector<int> v; // fill it up somehow v.erase(std::remove(v.begin(), v.end(), 99), v.end()); // really remove all elements with value 99 Или, если вы уверены, что он уникален, просто перебирайте вектор и стирайте найденный элемент. Что-то вроде: for( std::vector<T>::iterator iter = v.begin(); iter != v.end(); ++iter ) { if( *iter == VALUE ) { v.erase( iter ); break; } }
Ответ 2 Если вхождения уникальны, вы должны использовать std::set<T>, а не std::vector<T>. Это добавляет преимущества функции-члена erase, которая делает то, что вы хотите. Посмотрите, как использование правильного контейнера для задания дает вам более выразительные инструменты? #include <set> #include <iostream> int main() { std::set<int> notAList{1,2,3,4,5}; for (auto el : notAList) std::cout << el << ' '; std::cout << '\n'; notAList.erase(4); for (auto el : notAList) std::cout << el << ' '; std::cout << '\n'; } // 1 2 3 4 5 // 1 2 3 5 демо-версия
Ответ 3 На основе ответа Кирилла вы можете использовать эту функцию в своем коде: template<typename T> inline void remove(vector<T> & v, const T & item) { v.erase(std::remove(v.begin(), v.end(), item), v.end()); } И используйте его вот так remove(myVector, anItem);