Como faço para remover um item de um vetor stl com um certo valor?

Eu estava olhando a documentação da API para o vetor stl e notei que não havia nenhum método na class de vetor que permitisse a remoção de um elemento com um determinado valor. Isso parece uma operação comum, e parece estranho que não haja uma maneira de fazer isso.

std :: remove na verdade não apaga o elemento do container, mas retorna o novo iterador final que pode ser passado para container_type :: erase para fazer a remoção REAL dos elementos extras que estão agora no final do container :

std::vector vec; // .. put in some values .. int int_to_remove = n; vec.erase(std::remove(vec.begin(), vec.end(), int_to_remove), vec.end()); 

Se você quiser remover um item, o seguinte será um pouco mais eficiente.

 std::vector v; auto it = std::find(v.begin(), v.end(), 5); if(it != v.end()) v.erase(it); 

ou você pode evitar sobrecarga de mover os itens se o pedido não importa para você:

 std::vector v; auto it = std::find(v.begin(), v.end(), 5); if (it != v.end()) { using std::swap; // swap the one to be removed with the last element // and remove the item at the end of the container // to prevent moving all items after '5' by one swap(*it, v.back()); v.pop_back(); } 

Use o método global std :: remove com o iterador begin e end e, em seguida, use std :: vector.erase para realmente remover os elementos.

Links de documentação
std :: remove http://www.cppreference.com/cppalgorithm/remove.html
std :: vector.erase http://www.cppreference.com/cppvector/erase.html

 std::vector v; v.push_back(1); v.push_back(2); //Vector should contain the elements 1, 2 //Find new end iterator std::vector::iterator newEnd = std::remove(v.begin(), v.end(), 1); //Erase the "removed" elements. v.erase(newEnd, v.end()); //Vector should now only contain 2 

Obrigado a Jim Buck por apontar meu erro.

As outras respostas cobrem como fazer isso bem, mas achei que também gostaria de salientar que não é muito estranho que isso não esteja na API vetorial: é uma pesquisa linear e ineficiente através do vetor para o valor, seguida por um grupo de copiar para removê-lo.

Se você está fazendo essa operação intensamente, pode valer a pena considerar std :: set por este motivo.

Se você tem um vetor não classificado, então você pode simplesmente trocar com o último elemento vetorial e então resize() .

Com um contêiner ordenado, você ficará melhor com ‍ std std::vector::erase() . Note que existe um std::remove() definido em , mas que na verdade não faz o apagamento. (Leia a documentação cuidadosamente).

Veja também std :: remove_if para poder usar um predicado …

Aqui está o exemplo do link acima:

 vector V; V.push_back(1); V.push_back(4); V.push_back(2); V.push_back(8); V.push_back(5); V.push_back(7); copy(V.begin(), V.end(), ostream_iterator(cout, " ")); // The output is "1 4 2 8 5 7" vector::iterator new_end = remove_if(V.begin(), V.end(), compose1(bind2nd(equal_to(), 0), bind2nd(modulus(), 2))); V.erase(new_end, V.end()); [1] copy(V.begin(), V.end(), ostream_iterator(cout, " ")); // The output is "1 5 7". 

Uma solução mais curta (que não força você a repetir o nome do vetor 4 vezes) seria usar o Boost:

 #include  // ... boost::remove_erase(vec, int_to_remove); 

Veja http://www.boost.org/doc/libs/1_64_0/libs/range/doc/html/range/reference/algorithms/new/remove_erase.html

Se você quiser fazer isso sem qualquer acréscimo extra:

 vector myComponents; //assume it has items in it already. void RemoveComponent(IComponent* componentToRemove) { IComponent* juggler; if (componentToRemove != NULL) { for (int currComponentIndex = 0; currComponentIndex < myComponents.size(); currComponentIndex++) { if (componentToRemove == myComponents[currComponentIndex]) { //Since we don't care about order, swap with the last element, then delete it. juggler = myComponents[currComponentIndex]; myComponents[currComponentIndex] = myComponents[myComponents.size() - 1]; myComponents[myComponents.size() - 1] = juggler; //Remove it from memory and let the vector know too. myComponents.pop_back(); delete juggler; } } } }