我对 C++ 还很陌生。此代码作为使用 Lambda 为字符串建立索引的示例提供。 IE。字符串“123”变为 unsigned int 123。
我的问题是主要的 for 循环,以
lIndex
开头的行。我理解这一行的后半部分,其中数字字符 aKey[i]
减去 '0 的 ASCII 代码,以生成数字的十进制版本的 ASCII 代码。然而,我无法理解为什么lIndex
不断累加并乘以十。如果您回答的话谢谢!
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];
}
};
阅读“我理解这一行的后半部分,其中数字字符“aKey[i]”减去“0”的 ASCII 代码,以生成该数字的十进制版本的 ASCII 代码。”我有点怀疑你是否真的理解这一点,但我认为这更多的是措辞问题而不是误解。
我相信你想回答的是“为什么lIndex不断累加并乘以十”。
为了回答这个问题,请允许我向你发出一些命令,作为一个人,你必须执行这些命令:
很简单,结果就是14628。 如果你有 82641 也可以。
现在有一个变体,我想它会给你你想要的答案。
此时尝试使用袖珍计算器找到解决方案。
解决方案:
+0=
(遵守棘手的步骤)*10+
(准备好当前数字,以便可以使用下一个数字)4
+0=
*10+
那么你有效地得到((1*10)+4)*10+6)*10+2)*10+8=14628
我的意思是这是不言自明的,无需任何进一步解释, 因为我认为你需要的是“哦......我明白了”的经验,通过自己做你在代码中看到的事情。
在许多难以理解的代码的情况下,我建议使用笔和纸或袖珍计算器进行实验。