簡體   English   中英

C ++ std :: vector刪除MyClass對象

[英]C++ std::vector remove MyClass object

如果我有一個std :: vector,並且在代碼中的某個點上添加了MyClass對象的實例,那么以后如何從向量中刪除該特定對象?

(我在SO上發現了一個問題,該問題解釋了如何刪除int,但它們是原始的,我不知道相同的技術是否適用於用戶定義的類)

std::vector<MyClass> v;
MyClass m;
v.push_back(m);
.
.
.
//Wish to remove m from v??

編輯:您不知道m在向量中的位置。

如果您知道它仍然是最后一個元素:

v.pop_back();

其他

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

注意, push_back通過其復制ctor復制m ,它與調用push_back的代碼中的m不同,只是具有相同的值(不同於Java語義)。

編輯:

op==op<可以像這樣實現。

struct s {
    std::string name;
    int id;
};

bool operator==(const s& l, const s& r) {
    return l.id   == r.id
    &&     l.name == r.name
    ;
}

bool operator<(const s& l, const s& r) {
     return std::make_tuple(l.id, l.name)
     <      std::make_tuple(r.id, r.name)
     ;
}

您必須知道,向量存儲了自己的m副本。 因此,您需要為等於m定義一個條件。 然后,您可以使用std::findstd::find_if獲取到第一個等效實例的迭代器,然后調用std::vector::erase將其刪除。

假設通過operator==(const MyClass&, const MyClass&)定義了等價物,則

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

要使用其他條件:

bool eq(const MyClass& lhs, const MyClass& rhs) { .... }
auto it = std::find_if(v.begin(), v.end(), eq);
if(it != v.end()) 
  v.erase(it);

在這里, eq可以由函子實例或lambda表達式代替。

C ++ 11:

std::vector<int> v = {1,2,3,4,5};
auto end = std::remove(v.begin(), v.end(), 3);
v.resize(end - v.begin());

暫無
暫無

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

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