0

如果我有一个 std::vector 并且在某些时候通过代码添加了一个 MyClass 对象的实例,那么稍后我该如何从向量中删除该特定对象?

(我在 SO 上发现了一个问题,它解释了如何删除整数,但它们是原始的,我不知道相同的技术是否适用于用户定义的类)

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

编辑:您不知道 m 在向量中的位置。

4

3 回答 3

2

如果你知道它仍然是最后一个元素:

v.pop_back();

别的

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

请注意,通过它的复制 ctor 进行复制,它与push_back调用它的代码不同,只是具有相同的值(不像 Java 语义)。mmpush_back

编辑:

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)
     ;
}
于 2013-11-14T21:16:21.313 回答
1

您必须知道向量存储自己的m. 因此,您需要为与m. 然后,您可以使用std::findorstd::find_if获取第一个等效实例的迭代器,并调用std::vector::erase以将其删除。

假设 equivalenve 是通过 an 定义的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 表达式。

于 2013-11-14T21:17:20.280 回答
0

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());
于 2013-11-14T21:52:08.060 回答