Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无序地图中的Seg故障<;int,std::vector<;双倍>&燃气轮机;_C++_C++11_Stdvector_Unordered Map - Fatal编程技术网

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.保证条件不发生错误席仍然是它崩溃的原因之一。