gpt4 book ai didi

c++ - 就地 std::copy_if

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:03 27 4
gpt4 key购买 nike

在我看来,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 手动删除,如下所示:

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 是您想要的,而不是 copy_if,那么您有一个重叠范围的替代方案,即 copy_backward;来自 the documentation

If d_first is within [first, last), std::copy_backward must be used instead of std::copy.

关于c++ - 就地 std::copy_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22631147/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com