[英]In-place std::copy_if
在我看来, 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
,输入和输出范围可能不重叠。
还有其他选择吗?
copy_if
主要用于将范围复制到另一个范围/容器即设计,算法的性质是将满足某些条件的元素复制到另一个(非重叠)范围或新容器。
remove_if
更适合您的需求; 它完全按照您的期望过滤掉。 但是,它只通过覆盖删除元素; 函数完成后,旧端和新端之间的残余将是未指定的元素,需要使用erase
手动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
; 来自文档
如果d_first在[first,last]内,则必须使用std :: copy_backward而不是std :: copy。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.