就地std :: copy_if

时间:2014-03-25 10:04:30

标签: c++ c++11 stl

在我看来,std::copy_if对于过滤容器非常有用:

std::vector<int> vec { 1, 2, 3, 4 };
auto itEnd = std::copy_if(vec.begin(), vec.end(), vec.begin(),
                          [](int i) { return i > 2; });
vec.resize(itEnd - vec.begin());

但是,std::copy_if指定输入和输出范围可能不重叠。

有替代方案吗?

1 个答案:

答案 0 :(得分:20)

copy_if主要用于将范围复制到另一个范围/容器I.e.按照设计,算法的本质是将满足某些条件的元素复制到另一个(非重叠)范围或新容器。

remove_if更适合您的需求;它完全按照您的期望过滤掉。但是,它只通过覆盖删除元素;功能完成后,旧端和新端之间的残余将是未指定的元素,需要使用erase手动删除,如下所示:

std::vector<int> vec { 1, 2, 3, 4 };
vec.erase(std::remove_if(std::begin(vec),
                         std::end(vec),
                         [](int i) { return i <= 2; }),
          std::end(vec));

这是一个名为erase-remove的C ++习语。


而不是copy_if,如果copy是您想要的,那么您可以选择重叠范围,即copy_backward;来自the documentation

  

如果d_first在[first,last]内,则必须使用std :: copy_backward   而不是std :: copy。