You need to enable JavaScript to run this app. 如何将当前索引传入生成器函数以按奇偶规则填充C++数组
优惠活动
大模型
产品
解决方案
定价
更多

如何将当前索引传入生成器函数以按奇偶规则填充C++数组

基于索引驱动的数组填充实现

原有实现依赖生成器内部的静态局部变量交替翻转值,存在两个明显问题:

  • 静态变量会跨调用残留状态,多次执行填充逻辑时会出现取值反转的问题
  • 生成值和当前元素的实际索引没有绑定,若仅对数组的某一段区间执行generate,静态计数和实际索引完全错位

以下是几种可直接落地的索引感知实现方案:

方案1:直接按索引遍历赋值

最直观的实现方式,无额外状态依赖,每一步取值完全对应当前元素索引:

#include <array>
std::array<int, 64> arr;
for (std::size_t idx = 0; idx < arr.size(); ++idx) {
    // 偶数索引赋值-1,奇数索引赋值1
    arr[idx] = (idx % 2 == 0) ? -1 : 1;
}

方案2:适配std::generate的索引实现

如果需要保留使用std::generate算法的写法,可以通过带捕获的Lambda传递索引状态,替代原有有缺陷的全局生成器:

#include <array>
#include <algorithm>
std::array<int, 64> arr;
// 局部变量记录当前填充的索引,无跨调用残留问题
std::size_t current_idx = 0;
std::generate(arr.begin(), arr.end(), [&current_idx]() {
    int val = (current_idx % 2 == 0) ? -1 : 1;
    ++current_idx;
    return val;
});

如果需要从数组的中间位置开始填充,只需修改current_idx的初始值即可,不需要调整生成逻辑。

方案3:C++20 Ranges 链式实现

使用支持C++20及以上的编译器时,可以通过Ranges视图直接基于索引生成目标值,全程无隐式状态:

#include <array>
#include <ranges>
#include <algorithm>
std::array<int, 64> arr;
// 生成从0到数组长度的连续索引,按规则变换后拷贝到数组
auto value_view = std::views::iota(0, arr.size())
                | std::views::transform([](std::size_t idx) {
                    return (idx % 2 == 0) ? -1 : 1;
                });
std::ranges::copy(value_view, arr.begin());

如果需要将生成逻辑独立封装为函数,直接定义为接收索引参数的形式即可:

int generate_by_index(std::size_t idx) {
    return (idx % 2 == 0) ? -1 : 1;
}

调用时只需在遍历过程中将当前元素的索引传入该函数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 03:36:02