C ++从对象向量中选择

时间:2011-10-25 20:35:27

标签: c++ stl lambda

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

bool A::test();

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

使用STL和boost :: lambda这是最简单,最优雅的方法是什么? 没有C ++ 11)?

4 个答案:

答案 0 :(得分:4)

虽然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);

答案 1 :(得分:2)

我认为您可以使用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);

答案 2 :(得分:2)

您可以执行类似

的操作
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()为true的项目位于序列的第一部分,其他项目位于序列的第二部分。它将迭代器返回到第二组的第一个位置。

答案 3 :(得分:0)

反向走路怎么样?制作第一个向量的副本并使用remove_if。您只需要反转测试函数的返回值。像这样:

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