C++ 无序地图中的Seg故障<;int,std::vector<;双倍>&燃气轮机;
(分段错误)访问无序映射中与键关联的值时出错。我犯错误的地方有什么指示吗 以下代码片段中的分段错误:C++ 无序地图中的Seg故障<;int,std::vector<;双倍>&燃气轮机;,c++,c++11,stdvector,unordered-map,C++,C++11,Stdvector,Unordered Map,(分段错误)访问无序映射中与键关联的值时出错。我犯错误的地方有什么指示吗 以下代码片段中的分段错误: void read_mdl(const std::string& fname) { std::ifstream f(fname); std::unordered_map<int, std::vector<double>> pt_; while(f) { int xi = -1;
void read_mdl(const std::string& fname) {
std::ifstream f(fname);
std::unordered_map<int, std::vector<double>> pt_;
while(f) {
int xi = -1;
int pa = 0;
double score = -1;
f >> xi >> pa >> score;
if(xi == -1) { break; }
std::unordered_map<int, std::vector<double>>::iterator it = pt_.find(pa);
std::cout << xi << " " << pa << " " << score << std::endl;
if (it != pt_.end()) {
// Update from @Matthias247
auto a = pt_.insert(std::make_pair(pa, std::vector<double>(n_, 0)));
it = a.first;
}
(it->second)[xi] = score; // causing segmentation fault
}
}
void read\u mdl(const std::string&fname){
std::iff流(fname);
std::无序地图pt;
while(f){
席X==1;
int-pa=0;
双倍得分=-1;
F>>席>Pa>评分;
如果(xi==-1){break;}
std::无序映射::迭代器it=pt.find(pa);
std::cout如果迭代器找不到元素,则迭代器将被破坏。在这种情况下,您可以使用pt_u2;insert
插入新元素,但不更改迭代器。随后访问它将导致segfault。如果insert
返回迭代器,请执行新的查找或查找,并将其分配给it
更新:
如果我正确理解insert
API,它的工作原理应该是
if (it != pt_.end()) {
auto a = pt_.insert(std::make_pair(pa, std::vector<double>(n_, 0)));
it = a.first;
}
(it->second)[xi] = score;
if(it!=pt_u2;u.end()){
自动a=pt_u.insert(std::make_对(pa,std::vector(n_0));
首先,它=a;
}
(it->second)[xi]=分数;
找到了错误
这是在错误地检查密钥是否存在
关于我的代码片段:
if (it != pt_.end()) // incorrect way
if (it == pt_.end()) // right way
想想<>代码> < <代码> > = >代码> PTy.Enter()/<代码>。检查流中没有更多数据的方法有缺陷。参见为什么。也请阅读。使用例如<代码>(f>席> Pa>分数)也可以考虑,如果代码< Xi>=n> 。@ G.M.保证条件不发生错误席仍然是它崩溃的原因之一。