2016-01-06 66 views
1

我有一个对象向量,我想删除一些对象,而无需重新排序。如何在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的元素?

+0

你说你要*除去具有Z值小于0 *的所有元素,但您的代码示例删除具有'Z^<= 0元素' – Praetorian

回答

5

你想erase-remove 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; } 
+0

谢谢,我选择了这个答案,因为它是最优雅的,但我确定其他答案是正确的。我不得不修改它一些:vectors.erase(std :: remove_if(vectors.begin(),vectors.end(),[](const Vector3 &v){return vz <0;}),vectors.end )); – Mich

7

使用erase-remove成语。您需要使用一个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()); 
+2

最终,http://en.cppreference.com/w/cpp/experimental/vector/erase_if。 –

+0

@ T.C。在今天的VS2015中可用:) – melak47

+0

@melak考虑STL提出它并不奇怪:) – Praetorian

1

如果您还可以使用升压库,潜在的更优雅的方式写出remove_if/erase成语是使用boost的remove_erase_if

的代码会是这个样子:

boost::range::remove_erase_if(original_vector, 
           [](vector_element_type t) -> bool { 
           return t.z <= 0; 
          }); 
相关问题