如何创建可动态变化的C++ std::map?循环中用变量i更新值
用Lambda实现动态更新的std::map
你原来的问题核心是:std::map初始化时直接存储了i=0时的计算结果,而非计算逻辑,所以循环中i变化后,map里的值不会自动更新。用Lambda完全可以解决这个问题,思路是让map存储计算逻辑(即Lambda函数),每次需要值时,传入当前的i来动态计算。
具体实现步骤
1. 修改map的类型
把map的value类型从int16_t改成std::function<int16_t(uint8_t)>,这样就能存储接收一个uint8_t参数(即当前的i)并返回int16_t的Lambda函数。需要包含<functional>头文件。
2. 初始化存储Lambda的map
每个键对应的Lambda捕获数组array的引用,根据传入的i计算对应的值:
#include <functional> #include <map> #include <cmath> // 用于pow函数 // 假设array是已定义的二维数组,比如int16_t array[3][3]; std::map<uint8_t, std::function<int16_t(uint8_t)>> substitutions = { {0, [&array](uint8_t idx) { return array[idx][0]; }}, {1, [&array](uint8_t idx) { return array[idx][1]; }}, {2, [&array](uint8_t idx) { return array[idx][2]; }}, {3, [&array](uint8_t idx) { return array[idx][0] * array[idx][1]; }}, {4, [&array](uint8_t idx) { return array[idx][0] * array[idx][2]; }}, {5, [&array](uint8_t idx) { return array[idx][1] * array[idx][2]; }}, {6, [&array](uint8_t idx) { return array[idx][0] * array[idx][1] * array[idx][2]; }}, {7, [&array](uint8_t idx) { return static_cast<int16_t>(pow(array[idx][0], 2)); }}, {8, [&array](uint8_t idx) { return static_cast<int16_t>(pow(array[idx][1], 2)); }}, {9, [&array](uint8_t idx) { return static_cast<int16_t>(pow(array[idx][2], 2)); }} };
3. 循环中动态获取值
在for循环里,调用对应的Lambda函数并传入当前的i,就能得到基于最新i的计算结果:
int16_t anmSum = 0; uint8_t a = ...; // 替换为实际的键值 uint8_t b = ...; // 替换为实际的键值 for (uint8_t i = 0; i < 3; i++) { // 调用Lambda,传入当前i计算动态值 int16_t valA = substitutions.at(a)(i); int16_t valB = substitutions.at(b)(i); anmSum += valA * valB; }
关键说明
- 为什么原来的方案不行:原来的map存储的是固定值,初始化时就把i=0时的计算结果写入了,后续i变化不会触发重新计算。
- Lambda的优势:存储计算逻辑而非固定值,每次调用时根据传入的i实时计算,完美实现动态更新。
- 类型转换注意:
pow函数返回double类型,需要用static_cast<int16_t>转换成目标类型,避免隐式转换的问题。
内容的提问来源于stack exchange,提问作者Suspense
相关产品推荐
相关产品推荐

