这个 C++ 手动字符串索引器如何工作?

问题描述 投票:0回答:1

我对 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];
    }
};
c++ ascii indexer stoi
1个回答
0
投票

阅读“我理解这一行的后半部分,其中数字字符“aKey[i]”减去“0”的 ASCII 代码,以生成该数字的十进制版本的 ASCII 代码。”我有点怀疑你是否真的理解这一点,但我认为这更多的是措辞问题而不是误解。

我相信你想回答的是“为什么lIndex不断累加并乘以十”。

为了回答这个问题,请允许我向你发出一些命令,作为一个人,你必须执行这些命令:

  • 拿起笔和纸
  • 记下我告诉你的数字
  • 当我口述时,将它们写下来,使它们最终成为一个以十为基数的长整数
  • 1,4,6,2,8

很简单,结果就是14628。 如果你有 82641 也可以。

现在有一个变体,我想它会给你你想要的答案。

  • 带上袖珍计算器
  • 使用我告诉你的数字
  • 每次我给你一个数字时,在你当前拥有的数字上加0(这是为了防止你只输入数字,欺骗我......)
  • 1,4,6,2,8

此时尝试使用袖珍计算器找到解决方案。

解决方案:

  • 类型1
  • 类型
    +0=
    (遵守棘手的步骤)
  • 输入
    *10+
    (准备好当前数字,以便可以使用下一个数字)
  • 输入我给你的下一个数字,
    4
  • 类型
    +0=
  • 类型
    *10+
  • 输入我给你的下一个数字
  • 重复

那么你有效地得到((1*10)+4)*10+6)*10+2)*10+8=14628

我的意思是这是不言自明的,无需任何进一步解释, 因为我认为你需要的是“哦......我明白了”的经验,通过自己做你在代码中看到的事情。

在许多难以理解的代码的情况下,我建议使用笔和纸或袖珍计算器进行实验。

© www.soinside.com 2019 - 2024. All rights reserved.