繁体   English   中英

就地std :: copy_if

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM