簡體   English   中英

按值從向量中刪除元素 - C++

[英]Remove an element from a vector by value - C++

如果我有

vector<T> list

列表中的每個元素都是唯一的,如果我不知道它是否在列表中,那么刪除元素的最簡單方法是什么? 我不知道元素的索引,也不關心它是否不在列表中。

您可以對 std::vector 使用 Erase-remove 成語

引用:

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;
    }
}

根據 Kiril 的回答,您可以在代碼中使用此功能:

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);

如果出現是唯一的,那么您應該使用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

現場演示

從 c++20

//LIKE YOU MENTIONED EACH ELEMENT IS UNIQUE
std::vector<int> v = { 2,4,6,8,10 };

//C++20 UNIFORM ERASE FUNCTION (REMOVE_ERASE IDIOM IN ONE FUNCTION)
std::erase(v, 8); //REMOVES 8 FROM VECTOR

現在試試

std::erase(v, 12);

什么都不會發生,向量保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM