注意:我花了很多时间试图了解问题的来源。但是,当我写这篇文章时,我找到了解决问题的方法。然而,我认为它仍然值得张贴。此外,我对我的解释并不是100%肯定。
以下是一个简单示例的简化问题。
matrix
是二进制矩阵的稀疏表示。在这个例子中,我选择了:
1 0
1 1
0 0
1 1
每列由set<int>
表示,给出非零元素的索引。例如,对于矩阵的第一列,索引{0,1,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>
。
一定有插入问题......
答案 0 :(得分:0)
如果我理解正确:
问题来自于当我尝试使用给定密钥highestMapToColumns
在unordered_map highestIndex
中找到列时,它会插入(highestIndex,nullptr)
对,这可以防止任何在地图中进一步插入相同的密钥......
因此,highestMapToColumns
只会返回nullptr
,这是使用键highestIndex
插入的第一个值。