我有一个对象矢量,我想删除一些对象,而不需要重新排序。
我在这里找到了一些解决方案,但这些解决方案基于将vector元素与值进行比较。 [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&gt;的元素,我该怎么办? 0?
答案 0 :(得分: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());
答案 1 :(得分:6)
您想要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; }
答案 2 :(得分:1)
如果你可以使用boost库,那么编写remove_if / erase惯用法的一种更优雅的方法就是使用boost remove_erase_if。
代码看起来像这样:
boost::range::remove_erase_if(original_vector,
[](vector_element_type t) -> bool {
return t.z <= 0;
});