如何根据c++11中的特定条件从向量中擦除元素
How to erase elements from a vector based on a specific condition in c++11
我有一个对象向量,我想擦除一些对象,而不重新排序。
我在这里找到了一些解决方案,但这些解决方案是基于将向量元素与值进行比较。[如何有效地从排序向量中擦除值?
然而,我需要基于条件语句进行擦除,所以我认为我不能以现在的方式使用这些函数。
在这个例子中,我有一个三维矢量的矢量我需要删除所有Z值小于0的元素;
我现在拥有的是另一个由原始矢量创建的矢量:
for (int i = 0; i < original_vectors.size(); i++)
if (original_vectors[i].z > 0)
new_vectors.push_back(original_vectors[i]);
如何简单地删除Z不大于0的元素?
您想要擦除remove习惯用法,这是从支持条件的STL容器中删除元素的标准方法。此代码片段将删除predicate
返回true的所有矢量元素:
vector.erase(std::remove_if(vector.begin(), vector.end(), predicate), vector.end());
用于检查z < 0
是否为的谓词
auto predicate = [](const vec3 &v) { return v.z < 0; }
使用擦除-删除习惯用法。您需要使用lambda表达式来调用std::remove_if
,该表达式在z < 0
时返回true。
original_vectors.erase(std::remove_if(original_vectors.begin(),
original_vectors.end(),
[](decltype(original_vectors)::value_type const& elem) {
return elem.z < 0;
},
original_vectors.end());
如果您可以使用boost库,那么编写remove_If/erase习惯用法的一种可能更优雅的方法是使用boost的remove_erase_If。
代码看起来像这样:
boost::range::remove_erase_if(original_vector,
[](vector_element_type t) -> bool {
return t.z <= 0;
});
相关文章:
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 分割错误:向量中的擦除功能
- 如何使用擦除和迭代器来删除二维向量中的项目
- 从向量和对向量中擦除元素的差异
- 如何将某个元素从shared_ptr擦除到对象向量?
- 如何根据某些值擦除/删除类对象的向量
- 给定一个向量,擦除低于 itemsnum 的元素
- C++ 向量::使用类对象迭代器擦除不擦除向量成员
- C 矢量元素擦除与新向量创建
- 从向量中擦除元素是否也会擦除元素中存在的所有成员向量
- 向量擦除功能无法正常工作
- 使用迭代器时遇到问题,每 M 次传递一次擦除一个向量项
- 如何更有效地从向量或集合中擦除元素?
- 插入排序与插入/擦除?(所以我需要对一个向量进行排序,而不是手工做事,而是使用插入和擦除
- 使用擦除-删除范例将元素从一个向量移动到另一个向量
- 向量模板类:擦除(迭代器开始,迭代器端)
- remove_if然后擦除对向量有效吗
- 如何使用擦除删除习语从结构向量中删除值
- 使用索引向量擦除另一个向量的索引
- C++:向量::擦除用迭代器调用