C++从对象的向量中选择

C++从对象的向量中选择,c++,stl,lambda,C++,Stl,Lambda,我有一个具有以下成员方法的类a: bool A::test(); 我有一个物体的向量v。我想创建一个新的向量 从v中,仅选择A::test返回true的元素 使用STL和boost::lambda I实现这一点最简单、最优雅的方法是什么 没有C++11?我认为如果要这样做,可以使用remove\u copy\u,比如std::remove\u copy\u ifv.begin,v.end,std::back\u inserternew\u v,pred\u,当A::test\u为false时,

我有一个具有以下成员方法的类a:

bool A::test();
我有一个物体的向量v。我想创建一个新的向量 从v中,仅选择A::test返回true的元素

使用STL和boost::lambda I实现这一点最简单、最优雅的方法是什么 没有C++11?

我认为如果要这样做,可以使用remove\u copy\u,比如std::remove\u copy\u ifv.begin,v.end,std::back\u inserternew\u v,pred\u,当A::test\u为false时,返回true

当copy\u if没有进入早期标准时,您可以使用remove\u copy\u 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);

你可以这样做

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的项位于序列的第一部分,而其他项位于序列的第二部分。它返回一个迭代器到第二个组的第一个位置。

反过来怎么样?制作第一个向量的副本,并在必要时使用remove_。您只需要反转测试函数的返回值。大概是这样的:

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

不幸的是,由于疏忽,没有将_复制到C++03中。谢谢。为什么使用back_inserterb而不是b.begin?区别是什么?您使用back_插入器,因为它会将元素推回容器中。remove\u copy\u if将覆盖目标迭代器上的内容,因此我们必须在调用此函数之前调整b的大小,但我们事先不知道将其调整为什么。请记住,在调用remove\u if之后,您必须擦除不再使用的空间。