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

访问map元素时出现错误,附自定义Market结构体头文件代码

解决访问Market结构体中map元素的错误问题

先把你的Market结构体代码贴出来方便分析:

struct Market{
    string file_name;
    vector<string> symbol_list={"AA","AXP","BA","BAC","CAT","CSCO","CVX","DD", "DIS","GE","HD","HPQ","IBM","INTC","JNJ","JPM", "KFT","KO","MCD","MMM","MRK","MSFT","PFE", "PG","T","TRV","UTX","VZ","WMT","XOM"};
    map<long, vector<double>> stocks;
    Market()=default;
    Market(string s);
    double get_price(string, long) const;
    pair<double, double> high_low_year(long year, string symbol);
};
#endif

根据你的描述,访问stocks这个map元素时出错,我猜大概率是以下几个常见问题,给你逐个拆解:

1. const成员函数里用map::operator[]导致编译错误

你的get_price是const成员函数,如果你在实现里写了stocks[date],那肯定会报错——因为operator[]在键不存在时会自动插入一个默认构造的vector<double>,这会修改stocks容器,而const成员函数不允许修改成员变量。

解决方法:改用map::find()来查找键,它是const安全的,不会修改容器:

auto it = stocks.find(date);
if (it == stocks.end()) {
    // 这里处理日期不存在的情况,比如抛异常、返回NaN或者其他默认值
}

2. 未检查键是否存在就访问

如果直接用stocks[date],哪怕是非const函数,当date这个键不存在时,map会偷偷插入一个空vector,这可能不是你预期的逻辑,还会导致后续访问这个空vector时出现越界错误。

所以不管什么时候,访问map元素前都要先检查find()的返回值是不是stocks.end(),确认键存在后再通过it->second访问对应的vector。

3. 符号对应的vector索引不匹配

你的symbol_list里的每个符号对应stocks中每个vector的一个元素位置(比如"AA"对应vector的第0位),如果在get_price里找错了符号的索引,或者某个vector的元素数量比symbol_list的长度少,就会出现vector越界访问的错误。

解决方法:在获取索引时要先确认符号在symbol_list中存在,并且访问vector时检查索引范围:

// 先找符号在列表中的位置
auto sym_it = find(symbol_list.begin(), symbol_list.end(), symbol);
if (sym_it == symbol_list.end()) {
    throw invalid_argument("Invalid symbol: " + symbol);
}
int sym_idx = sym_it - symbol_list.begin();

// 再确认vector的长度足够
const auto& price_vec = it->second;
if (sym_idx >= price_vec.size()) {
    throw out_of_range("No price data for symbol " + symbol + " on this date");
}

完整的get_price实现示例

把上面的逻辑整合起来,一个安全的get_price实现应该是这样的:

#include <stdexcept>
#include <algorithm>

double Market::get_price(string symbol, long date) const {
    // 查找符号是否存在
    auto sym_it = find(symbol_list.begin(), symbol_list.end(), symbol);
    if (sym_it == symbol_list.end()) {
        throw std::invalid_argument("Symbol '" + symbol + "' not found in market list");
    }
    int sym_idx = std::distance(symbol_list.begin(), sym_it);

    // 查找日期对应的价格数据
    auto stock_it = stocks.find(date);
    if (stock_it == stocks.end()) {
        throw std::invalid_argument("No price data available for date: " + std::to_string(date));
    }
    const std::vector<double>& price_vec = stock_it->second;

    // 检查索引是否合法
    if (sym_idx < 0 || sym_idx >= price_vec.size()) {
        throw std::out_of_range("Symbol index out of bounds for date " + std::to_string(date));
    }

    return price_vec[sym_idx];
}

其他可能的坑

  • 确保Market(string s)构造函数正确初始化了stocks,每个long键对应的vector<double>长度和symbol_list一致,没有遗漏或者多余的元素。
  • 如果high_low_year函数里也有访问map和vector的逻辑,同样要遵循上面的检查原则,避免出现相同的错误。

内容的提问来源于stack exchange,提问作者Mari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:41:13