You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::partition_copy:当输出范围d_first_true与输入范围重叠时会发生什么?

std::partition_copy输出范围与输入范围重叠时的行为

当std::partition_copy的输出范围d_first_true(存放符合条件元素的输出起始位置)与输入范围发生重叠时,C++标准并未定义其行为——也就是说,具体结果会因编译器实现、运行环境的不同而产生差异,无法保证一致的输出。

以你提供的示例代码为例:

int original_range[] = {1, 2, 3, 4, 5, 6, 7};
int copy_here[7];

std::partition_copy(std::begin(original_range), std::end(original_range),
                    std::begin(original_range), std::begin(copy_here),
                    [](int val) { return val >= 4; });

在某些编译器下可能会得到你给出的结果:

  • original_range = {4, 5, 6, 7, 5, 6, 7}
  • copy_here = {1, 2, 3, 0, 0, 0, 0}(copy_here中未被填充的位置为初始垃圾值,此处假设为0)

出现这个结果的原因是算法按顺序遍历输入范围:

  • 前三个元素1、2、3不符合>=4的条件,被依次拷贝到copy_here的前三个位置;
  • 后续元素4、5、6、7符合条件,被依次拷贝到original_range的起始位置开始的区域:
    • 拷贝4到original_range[0],此时原数组第一个元素已处理完毕,覆盖不影响后续遍历;
    • 拷贝5到original_range[1],原第二个元素已处理;
    • 拷贝6到original_range[2],原第三个元素已处理;
    • 拷贝7到original_range[3],原第四个元素已处理;
  • 当遍历到原数组的5、6、7时,这些元素尚未被覆盖,仍符合条件,此时d_first_true的指针已移动到original_range[4]位置,于是将这三个元素依次拷贝到对应位置,最终形成{4,5,6,7,5,6,7}的结果。

但必须强调:这只是一种可能的表现,换用其他编译器或运行环境,可能得到完全不同的结果,甚至程序崩溃。因此在使用std::partition_copy时,必须确保两个输出范围(d_first_true和d_first_false)都与输入范围无重叠,才能保证行为的确定性。

内容的提问来源于stack exchange,提问作者Ellie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:15:01