如何根据 C++11 中的特定条件从向量中删除元素
How to erase elements from a vector based on a specific condition in c++11
我有一个对象向量,我想擦除一些对象而不重新排序。
我在这里找到了一些解决方案,但这些解决方案是基于将向量元素与值进行比较。
[How to erase a value efficiently from a sorted vector?
但是,我需要根据条件语句进行擦除,所以我认为我不能按原样使用这些函数。
在这个例子中,我有一个 3D 向量的向量
我需要删除所有 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 的元素?
将 erase-remove idiom. You'll need to call std::remove_if
与 lambda 表达式一起使用,当 z < 0
.
时 returns 为真
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());
您想 erase-remove idiom,这是从支持条件的 STL 容器中删除元素的标准方法。此代码片段将删除所有满足 predicate
returns true:
的向量元素
vector.erase(std::remove_if(vector.begin(), vector.end(), predicate), vector.end());
检查 z < 0
是否为:
的谓词
auto predicate = [](const vec3 &v) { return v.z < 0; }
如果您可以使用 boost 库,编写 remove_if/erase 惯用法的一种可能更优雅的方法是使用 boost 的 remove_erase_if.
代码看起来像这样:
boost::range::remove_erase_if(original_vector,
[](vector_element_type t) -> bool {
return t.z <= 0;
});
我有一个对象向量,我想擦除一些对象而不重新排序。
我在这里找到了一些解决方案,但这些解决方案是基于将向量元素与值进行比较。 [How to erase a value efficiently from a sorted vector?
但是,我需要根据条件语句进行擦除,所以我认为我不能按原样使用这些函数。
在这个例子中,我有一个 3D 向量的向量 我需要删除所有 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 的元素?
将 erase-remove idiom. You'll need to call std::remove_if
与 lambda 表达式一起使用,当 z < 0
.
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());
您想 erase-remove idiom,这是从支持条件的 STL 容器中删除元素的标准方法。此代码片段将删除所有满足 predicate
returns true:
vector.erase(std::remove_if(vector.begin(), vector.end(), predicate), vector.end());
检查 z < 0
是否为:
auto predicate = [](const vec3 &v) { return v.z < 0; }
如果您可以使用 boost 库,编写 remove_if/erase 惯用法的一种可能更优雅的方法是使用 boost 的 remove_erase_if.
代码看起来像这样:
boost::range::remove_erase_if(original_vector,
[](vector_element_type t) -> bool {
return t.z <= 0;
});