如何根据c++11中的特定条件从向量中擦除元素

How to erase elements from a vector based on a specific condition in c++11

本文关键字:向量 擦除 元素 特定条件 何根 c++11      更新时间:2023-10-16

我有一个对象向量,我想擦除一些对象,而不重新排序。

我在这里找到了一些解决方案,但这些解决方案是基于将向量元素与值进行比较。[如何有效地从排序向量中擦除值?

然而,我需要基于条件语句进行擦除,所以我认为我不能以现在的方式使用这些函数。

在这个例子中,我有一个三维矢量的矢量我需要删除所有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;
                             });