C++是否有可存储三个及以上元素的数据结构可替换示例代码中的xxx?
你要的这种固定多字段集合的初始化需求,用标准库就能直接实现,不需要额外找第三方数据结构。你之前觉得vector、map等容器不满足需求,是因为容器的模板参数只接受元素类型,你需要先把三个字段打包成单个元素类型(结构体/tuple),再传给容器即可。两种常用实现方式如下:
方案1:自定义结构体 + 标准序列容器(最推荐,可读性最高)
先把单个命令的三个属性封装为结构体,再用std::vector或者std::array存储即可:
#include <vector> #include <string> // 先定义命令项结构体 struct Command { std::string name; std::string description; void (*handler)(std::string); }; // 直接初始化即可,和你写的语法完全一致 const std::vector<Command> commands = { {"exit", "Exit Program", f1}, {"test", "Start Test", f2}, {"help, h", "Help Screen", f3} };
如果命令数量固定不会变动,可以换用std::array<Command, 3>,内存占用更低,性能更好。
方案2:直接用std::tuple打包属性(不需要额外定义结构体)
如果不想单独定义结构体,也可以直接用std::tuple把三个属性打包成容器的元素类型:
#include <vector> #include <tuple> #include <string> const std::vector<std::tuple<std::string, std::string, void (*)(std::string)>> commands = { {"exit", "Exit Program", f1}, {"test", "Start Test", f2}, {"help, h", "Help Screen", f3} };
这种方案的缺点是取属性的时候需要用std::get<0>(command)、std::get<1>(command)这种语法,可读性不如自定义结构体。
附加方案:需要快速按命令名查找的场景
如果你的核心需求是输入命令名后快速匹配对应的处理函数,可以用std::unordered_map做索引,把描述和处理函数打包成值类型:
#include <unordered_map> #include <string> struct CommandInfo { std::string description; void (*handler)(std::string); }; const std::unordered_map<std::string, CommandInfo> commands = { {"exit", {"Exit Program", f1}}, {"test", {"Start Test", f2}}, {"help", {"Help Screen", f3}}, {"h", {"Help Screen", f3}} };
这种方式查找命令的时间复杂度是O(1),不需要遍历整个列表,适合命令数量多的场景。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

