C++ std::vector 删除 MyClass 对象
C++ std::vector remove MyClass object
如果我有一个 std::vector,并且在代码的某个时候我添加了 MyClass 对象的实例,稍后我如何从向量中删除该特定对象?
(我在 SO 上发现了一个问题,它解释了如何删除整数,但它们是原始的,我不知道相同的技术是否适用于用户定义的类)
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
,它与调用的代码中的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)
;
}
您必须知道向量存储自己的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 表达式。
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());
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- MyClass obj = MyClass();'MyClass()'在这里指的是临时对象吗?
- 如何重载 = 'MyClass 对象 = f(x)' 的运算符?
- C++ std::vector 删除 MyClass 对象
- MyClass::元对象VS2005的Qt链接问题
- shared_ptr<my_class>对象将不被接受为纯虚拟基类中的 myclass 方法参数
- 在C++中,如果我引用一个具有解除分配析构函数~MyClass的对象,那么超出范围的引用会调用析构函数吗
- 错误:不允许对类型 "const MyClass" 的对象使用 '{...}' 进行初始化