Я новичок в C++. Этот код был предоставлен в качестве примера использования Lambdas для индексации строк. то есть. строка «123» становится беззнаковым целым числом 123.
Моя проблема — основной цикл for, строка, начинающаяся с lIndex. Я понимаю вторую половину этой строки, где цифровой символ aKey[i] вычитается из кода ASCII '0, чтобы получить код 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];
}
};
Подумайте о том, что 1 равно 0 * 10 + 1; 12 — это 1*10+2; 123 — это 12*10+3; 1234 это 123*10+4,...





Читаю: «Я понимаю вторую половину этой строки, где числовой символ «aKey[i]» вычитается из кода ASCII «0», чтобы получить код ASCII десятичной версии числа». Я как бы сомневаюсь, что вы это действительно поняли, но предполагаю, что это скорее проблема формулировки, чем недоразумение.
Я надеюсь, что вам нужен ответ: «Почему lIndex продолжает накапливаться и умножаться на десять».
В ответ позвольте мне дать вам несколько приказов, которые вы должны выполнить, как человек:
Это легко, результат — 14628. Если у вас есть 82641, это тоже нормально.
Теперь вариант, который, я думаю, даст вам желаемый ответ.
На этом этапе попробуйте найти решение с помощью карманного калькулятора.
Решение:
+0= (сложный шаг выполнен)*10+ (подготовьте текущий номер, чтобы можно было использовать следующую цифру)4+0=*10+Тогда вы фактически получите ((((1*10)+4)*10+6)*10+2)*10+8=14628
Я имею в виду, что это самоочевидно без каких-либо дополнительных объяснений, потому что я думаю, что вам нужен опыт «Оооо... я вижу», когда вы делаете то, что видите в коде.
Я рекомендую эксперименты/развлечения с ручкой и бумагой или карманным калькулятором во многих случаях, когда код труден для понимания.
Просто предложение: перепишите это с нуля. Я относительно уверен, что вы воспроизведете код, аналогичный приведенному выше. Также имейте в виду, что этот код не просто преобразует
"123"в123, он использует это для индексации в коллекцию (например,std::vectorилиstd::string) с результатом. Я думаю, ваш вопрос касается только той части, которая преобразует строку в целое число, поэтому попробуйте переписать ее.