如何在C++中实现类似Lua的键值结构存储自定义CryptoStats类实例
实现方案
容器选择说明
你需要的是字符串为键、加密货币数据类为值的键值对存储结构,和Lua表的行为完全对应,之前使用std::set无法实现需求的原因是:std::set是仅存储单一类型元素的有序不重复集合,不支持键值对下标访问逻辑。
C++中直接使用关联容器std::unordered_map或std::map即可实现需求,两者都支持[]运算符访问,用法和你给出的Lua表几乎一致:
- 若键不存在,访问
容器[键名]时会自动创建默认初始化的对应值 - 支持直接修改指定键对应的值属性
- 支持快速校验键是否存在、遍历所有元素等操作
代码实现示例
首先定义容器:
#include <unordered_map> #include <string> // 你的CryptoStats类定义保持不变 class CryptoStats { public: std::string name; std::string lastPriceStr; int lastPrice = 0; int score = 0; int priceHistory[2] = { 0,0 }; // 索引0存时间、索引1存价格 }; // 定义全局/对应作用域下的存储容器,等价于你给出的Lua表 std::unordered_map<std::string, CryptoStats> cryptoStats;
常用操作示例
- 创建/访问指定交易对的实例:
// 若BTCUSD不存在会自动创建默认初始化的CryptoStats实例,直接修改属性即可 cryptoStats["BTCUSD"].lastPrice = 30000; cryptoStats["BTCUSD"].score = 85;
- 校验某交易对实例是否存在:
// C++20及以上版本可直接用contains方法 if (cryptoStats.contains("ETHUSD")) { // 实例存在的处理逻辑 } // 低版本C++用find方法 if (cryptoStats.find("ETHUSD") != cryptoStats.end()) { // 实例存在的处理逻辑 }
- 遍历所有已存储的交易对数据:
for (auto& item : cryptoStats) { const std::string& symbol = item.first; // 交易对名称,即键 CryptoStats& stats = item.second; // 对应的数据实例 // 你的遍历处理逻辑 }
优化建议
你当前的实现方案可以做两处小调整提升易用性:
- 可以删除
CryptoStats类中的name字段,因为容器的键本身就是交易对名称,重复存储会造成不必要的内存占用 - 若后续需要存储更长的价格历史,可以把
int priceHistory[2]替换为std::vector<std::pair<int64_t, int>>,支持动态新增历史记录,比固定长度数组更灵活
内容的提问来源于stack exchange,提问作者JayMeazy
相关产品推荐
相关产品推荐

