从对象的向量中选择

C++ select from a vector of objects

本文关键字:选择 向量 对象      更新时间:2023-10-16

我有一个类a,其成员方法如下:

bool A::test();

我有一个vector<A> v (a对象)我想创建一个新的vector<A>从v中,只选择A::test()返回true的元素

使用STL和boost::lambda(1)来实现这一点的最简单和最优雅的方法是什么

虽然copy_if没有进入早期的标准,但您可以使用remove_copy_if完成相同的事情。

如果你有c++ 11可用,它非常简单:

std::remove_copy_if(
      v.begin(),
      v.end(),
      std::back_inserter(b),
      [] (const A& val) -> bool
      { return val.test(); });

因为你没有c++ 11,仍然很简单:

// global free function
bool test_a(const A& a) { return a.test(); }
std::remove_copy_if(
      v.begin(),
      v.end(),
      std::back_inserter(b),
      test_a);

我认为你可以使用remove_copy_if来做到这一点,比如std::remove_copy_if(v.begin(), v.end(), std::back_inserter(new_v), pred_that_returns_true_when_A::test()_is_false);

你可以这样做

std::vector<A>::iterator testFailedIt = std::stable_partition(v.begin(), v.end(), test());
std::copy(v.begin(), testFailedIt, std::back_inserter(newVector));

如果你不关心元素的相对顺序,std::partition也可以。

std::partition/stable_partition对序列中的元素重新排序,使test()为真的项位于序列的第一部分,其他项位于序列的第二部分。它返回第二个组的第一个位置的迭代器。

反过来呢?复制第一个vector对象并使用remove_if。您只需要反转测试函数的返回值。像这样:

std::vector<A> second_vector(first_vector);
std::erase(std::remove_if(second_vector.begin(), second_vector.end(), test), second_vector.end());