在我看来,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
指定输入和输出范围可能不重叠。
有替代方案吗?
答案 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。