访问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
相关产品推荐
相关产品推荐

