如果我有一个std :: vector并且在某些时候通过代码我添加了一个MyClass对象的实例,稍后如何从向量中删除那个特定的对象?
(我在SO上发现了一个问题,解释了如何删除整数,但它们是原始的,我不知道相同的技术是否适用于用户定义的类)
std::vector<MyClass> v;
MyClass m;
v.push_back(m);
.
.
.
//Wish to remove m from v??
编辑:你不知道矢量中m的位置。
答案 0 :(得分:2)
如果你知道它仍然是最后一个元素:
v.pop_back();
否则
auto it=std::find(begin(v),end(v),m);
if(it!=end(v)) v.erase(it);
请注意,push_back
通过它的副本ctor重复m
,它与调用m
的代码中的push_back
不同,它只具有相同的值(不像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)
;
}
答案 1 :(得分:1)
您必须知道该向量存储了自己的m
副本。因此,您需要为等同于m
的内容定义标准。然后,您可以使用std::find
或std::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表达式替换。
答案 2 :(得分: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());