Удалить элемент из вектора по значению - C ++ - PullRequest
13 голосов
/ 03 октября 2011

Если у меня есть

vector<T> list

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

Ответы [ 3 ]

18 голосов
/ 03 октября 2011

Вы можете использовать идиому Erase-remove для 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 голосов
/ 23 апреля 2014

Если вхождения уникальны, то вы должны использовать 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

Демонстрационная версия

1 голос
/ 23 апреля 2014

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...