Подтвердить что ты не робот

Удалить элемент из вектора по значению - С++

Если у меня

vector<T> list

Где каждый элемент в списке уникален, какой самый простой способ удаления элемента при условии, что я не знаю, включен ли он в список или нет? Я не знаю индекс элемента, и мне все равно, не он ли он в списке.

4b9b3361

Ответ 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);