Если у меня
vector<T> list
Где каждый элемент в списке уникален, какой самый простой способ удаления элемента при условии, что я не знаю, включен ли он в список или нет? Я не знаю индекс элемента, и мне все равно, не он ли он в списке.
Если у меня
vector<T> list
Где каждый элемент в списке уникален, какой самый простой способ удаления элемента при условии, что я не знаю, включен ли он в список или нет? Я не знаю индекс элемента, и мне все равно, не он ли он в списке.
Вы можете использовать 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;
}
}
Если вхождения уникальны, вы должны использовать 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
На основе ответа Кирилла вы можете использовать эту функцию в своем коде:
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);