用#include初始化Unordered_map

unordered_map initialization with #include

本文关键字:map Unordered 初始化 #include      更新时间:2023-10-16
std::unordered_map<std::string, std::string> mimeMap = {
    #define STR_PAIR(K,V) std::pair<std::string, std::string>(K,V)
    #include "MimeTypes.inc"
};

mimetype文件。Inc就像:

STR_PAIR("3dm", "x-world/x-3dmf"),
STR_PAIR("3dmf", "x-world/x-3dmf"),
STR_PAIR("a", "application/octet-stream"),
STR_PAIR("aab", "application/x-authorware-bin"),
STR_PAIR("aam", "application/x-authorware-map"),
STR_PAIR("aas", "application/x-authorware-seg"),
STR_PAIR("abc", "text/vnd.abc"),
STR_PAIR("acgi", "text/html"),
STR_PAIR("afl", "video/animaflex"),
STR_PAIR("ai", "application/postscript"),
STR_PAIR("aif", "audio/aiff"),

我很困惑。下面的代码如何初始化unordered_map ?

#include进行文本复制粘贴。就好像你直接写了下面的代码:

std::unordered_map<std::string, std::string> mimeMap = {
    #define STR_PAIR(K,V) std::pair<std::string, std::string>(K,V)
    STR_PAIR("3dm", "x-world/x-3dmf"),
    // ...
    STR_PAIR("aif", "audio/aiff"),
}; 

现在,STR_PAIR是一个预处理宏,将其参数替换为std::pair<std::string, std::string>(K,V), KV作为宏的参数。例如,上面的代码片段与:

没有什么不同。
std::unordered_map<std::string, std::string> mimeMap = {
    std::pair<std::string, std::string>("3dm", "x-world/x-3dmf"),
    // ...
    std::pair<std::string, std::string>("aif", "audio/aiff"),
}; 

如果您正在使用gcc或clang,您可以使用-E命令行选项来获得预处理的输出并自己查看。但要注意,它会相当大。

最后,这样的pair用于复制初始化mimeMap的元素。

这段代码也有bug,因为mapvalue_typepair<const Key, Value>,所以STR_PAIR实际上应该创建std::pair<std::string const, std::string>

从参考文档中,您可以选择使用std::initializer_list构造函数(5):

map( std::initializer_list<value_type> init,
     const Compare& comp = Compare(),
     const Allocator& alloc = Allocator() );

宏从std::pair s构建一个,#include指令替换{}大括号内的文本。最后,它的计算结果为:

std::unordered_map<std::string, std::string> mimeMap = {
    #define STR_PAIR(K,V) std::pair<std::string, std::string>(K,V)
    std::pair<std::string, std::string>("3dm", "x-world/x-3dmf"),
    std::pair<std::string, std::string>("3dmf", "x-world/x-3dmf"),
    std::pair<std::string, std::string>("a", "application/octet-stream"),
    std::pair<std::string, std::string>("aab", "application/x-authorware-bin"),
    std::pair<std::string, std::string>("aam", "application/x-authorware-map"),
    std::pair<std::string, std::string>("aas", "a");
    std::pair<std::string, std::string>(pplication/x-authorware-seg"),
    std::pair<std::string, std::string>("abc", "text/vnd.abc"),
    std::pair<std::string, std::string>("acgi", "text/html"),
    std::pair<std::string, std::string>("afl", "video/animaflex"),
    std::pair<std::string, std::string>("ai", "application/postscript"),
    std::pair<std::string, std::string>("aif", "audio/aiff"),    
};