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

C++手动字符串索引器工作原理:循环中lIndex乘10累加的原因

数字字符串转数值的循环逻辑解析

你理解aKey[i] - '0'是把字符转成对应十进制数字,这部分没问题。那循环里lIndex = lIndex * 10 + (static_cast<size_t>(aKey[i]) - '0')的逻辑,用具体例子拆解就一目了然了,拿你说的"123"来一步步走:

  • 初始时lIndex = 0
  • 处理第1个字符'1':0 * 10 + 1 = 1,此时lIndex变成1,对应字符串的第一位数字
  • 处理第2个字符'2':1 * 10 + 2 = 12,lIndex变成12,这是前两位数字组成的数值
  • 处理第3个字符'3':12 * 10 + 3 = 123,最终得到完整的数字

本质上,每处理一位新数字时,把之前的结果乘以10,相当于把已有的数字整体往左挪一位(十进制里的进位),然后加上当前位的数字,这样就能逐步把字符串里的数字拼接成完整的数值——这和我们手动读数字的逻辑完全一样:看到"123",先记1,看到2就知道是10+2=12,再看到3就是120+3=123。

附你提供的示例代码:

template <typename T, size_t N = 20>
class StringIndexerLambda {
private:
    BasicIndexer<T, N> fElements;

public:
    T& operator[](const std::string& aKey) { return item(aKey); }

    T& item(
        const std::string& aKey, std::function<size_t(const std::string&)> aMap = [](const std::string& aKey) {
            size_t lIndex = 0;

            for (size_t i = 0; i < aKey.size(); i++) {
                lIndex = lIndex * 10 + (static_cast<size_t>(aKey[i]) - '0');
            }

            return lIndex;
        }) {
        size_t lIndex = aMap(aKey);

        assert(lIndex < fElements.size());

        return fElements[lIndex];
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:00:11