如何在全局级别定义unordered_map?

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

我试图在全局级别定义两个无序映射,我用循环定义它们,并且我不想将循环放入

main()

更具体地说,我试图定义一个基于 36 的字母表,我使用阿拉伯数字表示数字 0-9,然后使用基本拉丁字母表表示数字 10-35,一个映射用于将字符串转换为整数,并且它应该支持大写和小写,另一个用于将整数转换为其给定基数中的字符串表示形式,并且它只能是小写。

这是我的代码,显然它不起作用:

#include <unordered_map>

using namespace std;
const unordered_map<string, int> digits;
const unordered_map<int, string> alphabet;

for (int i = 0; i < 10; i++) {
    string d = char(i + 48);
    digits[d] = i;
    alphabet[i] = d;
}

for (int i = 10; i < 36; i++) {
    string upper = char(i + 55);
    string lower = char(i + 87);
    digits[upper] = i;
    digits[lower] = i;
    alphabet[i] = lower;
}

我知道如果我将循环放入

main()
函数中,它应该可以工作。但我不想那样做。

有没有办法直接初始化它们,并使用赋值运算符来定义它们,可能需要理解?

类似于以下Python代码:

DIGITS = {
    **{chr(i + 48): i for i in range(10)},
    **{chr(i + j): i for i in range(10, 36) for j in (55, 87)},
}

ALPHABET = {
    **{i: chr(i + 48) for i in range(10)},
    **{i: chr(i + 87) for i in range(10, 36)},
}
c++ global-variables c++20 unordered-map
1个回答
0
投票

使用直接调用的 lambda 表达式来初始化变量。


#include <unordered_map>
#include <string>
#include <iostream>

// using namespace std; <== do not do this
const auto digits = [] 
{
    std::unordered_map<std::string, int> digits;
    for (int i = 0; i < 10; i++)
    {
        digits.insert({ std::to_string(i), i });
    }
    return digits;
}(); // make a lambda expression and immediately invoke it.

int main()
{
    for (const auto& [key, value] : digits)
    {
        std::cout << "[" << key << ", " << value << "]\n";
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.