unordered_map插入失败

时间:2017-02-14 14:37:53

标签: c++ unordered-map nullptr

注意:我花了很多时间试图了解问题的来源。但是,当我写这篇文章时,我找到了解决问题的方法。然而,我认为它仍然值得张贴。此外,我对我的解释并不是100%肯定。

以下是一个简单示例的简化问题。

matrix二进制矩阵的稀疏表示。在这个例子中,我选择了:

1 0
1 1
0 0
1 1

每列由set<int>表示,给出非零元素的索引。例如,对于矩阵的第一列,索引{0,1,3}的行不为零。

算法目标

  • 对于每列,找到该列的最高索引(例如,第一列为3),查看highestMapToColumns unordered_map中是否已插入某列。< / LI>
  • 然后,如果找到列,请对列执行一些操作。但是,为清楚起见,此处不执行任何操作。
  • 最后,将对(highestIndex,column)添加到无序地图highestMapToColumns

`

// main.cpp
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <unordered_map>

using namespace std;

int main(int argc, char** argv) {

    vector<set<int>* >* matrix = new vector<set<int>* >();
    int column1[]= {0,1,3};
    int column2[]= {1,3};
    matrix->push_back(new set<int>(column1,column1+3));
    matrix->push_back(new set<int>(column2,column2+2));

    unordered_map<int, set<int>* > highestMapToColumns;
    int highestIndex = -1;
    for(vector<set<int>* >::iterator iteratorOnColumns = matrix->begin();iteratorOnColumns!=matrix->end();iteratorOnColumns++){
        while(true){
            if((*iteratorOnColumns)->size() == 0){
                highestIndex = -1;
                break;
            }
            highestIndex = *((*iteratorOnColumns)->rbegin());
            cout<<"Attempting to get index : "<<highestIndex<<endl;
            set<int>* toSubstract = highestMapToColumns[highestIndex];
            if (toSubstract != nullptr) {
                cout<<"Column found !!"<<endl;
                break;
            }else{ 
                cout<<"Column not found"<<endl;
                break;
            }
        }
        if(highestIndex != -1){
            cout<<"Attempting to insert index : "<<highestIndex<<endl;
            highestMapToColumns.insert(make_pair(highestIndex, (*iteratorOnColumns)));
        }
    }
    return 0;
}
该程序的

输出

Attempting to get index : 3
Column not found
Attempting to insert index : 3
Attempting to get index : 3
Column not found
Attempting to insert index : 3

第一个“未找到列”输出正常,因为无序地图中没有插入任何内容,但第二个不是。

我插入了一个断点,并在插入时进行了调试。我发现*iteratorOnColumns不是nullptr,而是指向代表column1的预期set<int>

一定有插入问题......

1 个答案:

答案 0 :(得分:0)

如果我理解正确:

问题来自于当我尝试使用给定密钥highestMapToColumns在unordered_map highestIndex中找到列时,它会插入(highestIndex,nullptr)对,这可以防止任何在地图中进一步插入相同的密钥......

因此,highestMapToColumns只会返回nullptr,这是使用键highestIndex插入的第一个值。