使用#include进行unordered_map初始化

时间:2016-10-17 18:39:20

标签: c++ data-structures

std::unordered_map<std::string, std::string> mimeMap = {
    #define STR_PAIR(K,V) std::pair<std::string, std::string>(K,V)
    #include "MimeTypes.inc"
};

文件MimeTypes.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

2 个答案:

答案 0 :(得分:9)

#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的元素。

此代码也有错误,因为map的{​​{1}}为value_type,因此pair<const Key, Value>应该实际创建STR_PAIR

答案 1 :(得分:1)

reference documentation您可以选​​择使用std::initializer_list构造函数(5):

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

宏从std::pair构建一个,#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"),    
};