当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何根据c++11中的特定条件从向量中擦除元素》经验,为你挑选了2个好方法。

我有一个对象的矢量,我想删除一些对象,而无需重新排序.

我在这里找到了一些解决方案,但这些解决方案基于将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的元素,我该怎么做?



1> Praetorian..:

使用擦除删除习语.您需要std::remove_if使用lambda表达式调用,该表达式在返回时返回true 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());


最后,http://en.cppreference.com/w/cpp/experimental/vector/erase_if.

2> ajshort..:

您想要擦除 - 删除idiom,这是从支持条件的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; }

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有