如何将当前索引传入生成器函数以按奇偶规则填充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(), [¤t_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
相关产品推荐
相关产品推荐

