在C++中创建一个动态文本可寻址列表

TER*_*Mtm 0 c++ c++11

在大多数脚本语言中,对象通常是项的集合,绑定到这些对象中的名称.例如(在Javascript中),如果我要初始化这个:

colors = {
    Blue:  0x0000FF; //Hex Values
    Green: 0x00FF00;
    Red:   0xFF0000;
}
Run Code Online (Sandbox Code Playgroud)

在运行时,如果用户输入列出的颜色,我可以轻松返回相应的十六进制值colors["given_color"].

但是,如何在C++或其他编译语言中表达一个甚至类似的远程机制呢?创造一个enum只会静态地具有意义,在一个人为的例子中:

public enum colors{
    CYAN     =  0x00FFFF,
    MAGENTA  =  0xFF00FF,
    YELLOW   =  0xFFFF00
}
Run Code Online (Sandbox Code Playgroud)

不能以任何方式用于查找相应的Hex的说法 std::cin << givenColor;

话虽这么说,我有什么选择转换std::string成数据点,指针或函数指针?

Rei*_*ica 6

您正在寻找的数据结构称为地图(或字典或关联数组).在C++中,std::map总是排序(通常实现为红黑树),并且std::unordered_map通常更快,因为它使用哈希表(但内容是任意顺序).

std::unordered_map<std::string, int> colors = {
    {"blue", 0x0000FF},
    {"green", 0x00FF00},
    {"red", 0xFF0000}
};

std::string key = /* something */;
std::string value = colors[key];
Run Code Online (Sandbox Code Playgroud)

回答评论中的问题:是的,您可以在地图中存储您想要的任何内容.唯一的限制是对std::unordered_map,关键型需求实现的哈希函数和operator==,和std::map,密钥类型需要实现operator<.值类型可以是任何值.

  • 如果您想要不区分大小写,您可能希望仅以大写/小写形式存储键并将所有传入查询转换为该大小写. (3认同)