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_
相关产品推荐
相关产品推荐

