You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:27:03