我有一个A类,其成员方法如下:
bool A::test();
我有一个vector<A> v
个A对象。我想创建一个新的vector<A>
从v,只选择A :: test()返回true的那些元素。
使用STL和boost :: lambda这是最简单,最优雅的方法是什么? 没有C ++ 11)?
答案 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());