unordered_map中的段错误<int,std :: vector <double =“”>&gt;

时间:2017-01-28 12:28:01

标签: 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;
            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
        }
    }

2 个答案:

答案 0 :(得分:0)

在没有找到元素的情况下,你的迭代器会被破坏。在这种情况下,您使用foreach (var id in factoryIds) { var collection = session.Advanced.LoadStartingWith<CarPart>(prefix + id + "/parts"); result.AddRange(collection); } 插入一个新元素,但不要更改迭代器。之后访问它会导致段错误。如果pt_.insert返回迭代器并将其分配给insert,则执行新的查找或查找。

<强>更新

如果我正确理解it API,它应该像

一样工作
insert

答案 1 :(得分:0)

发现错误。

检查密钥是否存在是错误的。

关于我的代码段:

if (it != pt_.end()) // incorrect way

if (it == pt_.end()) // right way