【发布时间】:2021-09-22 17:43:29
【问题描述】:
我正在尝试完成作业并出现错误。 我想要做的是:有一个无序映射,其键包含值作为 unordered_set,其中可能有“可能与无序外部映射的键具有相同名称”的键。
为了特别,我正在尝试实现一个 k 核算法,计数和 k 数字就在那里。我正在尝试删除具有小于 k 大小的 unordered_sets(包含邻居,调用 N)的 unordered_map 键(让我们调用 P)。 但是由于我从P节点中删除了N条目,我还需要从外部映射中找到N条目并找到P并将其删除。
以下代码是我到目前为止想出的(还有更多,但我不想抄袭或任何东西)。在调试过程中,我注意到有点 cout
编辑:我已经根据建议更新了代码,但是有一个新问题:对于 k=1,节点的数量是正确的。但是在 k=2,3,4.. 之后,最外层循环是无限循环的。并且大小保持不变(取出 k=1 的节点后)
while(nodes.size()!=0)
{
int count = 0;
while(stillLeft){
stillLeft = 0;
it = nodes.begin();
while(it != nodes.end()){
if(it->second.size()<=k){
stillLeft = 1;
++count;
for ( innerit = it->second.begin(); innerit != it->second.end();innerit++ ){
nodes.find(*innerit)->second.erase(it->first);
}
it = nodes.erase(it);
}
else{
++it;
}
}
}
cout << nodes.size() << endl;
kCoreNumbers.push_back(count);
++k;
}
【问题讨论】:
-
试过在onlinegdb调试它?
-
另外,这就是你正在处理的
{{1, {1, 2}}, {5, {6, 1, 7}}},所以如果k= 2,你删除节点1,现在你还需要从邻居列表中删除它节点5改成{5, {6,7}(需要再次删除? -
@Zoso 是的。我没有尝试过在线调试器,因为我不知道如何使用调试器工具。我只用 cout 线调试。
-
看起来您正在擦除
P所指的节点。这可能会破坏 for 循环迭代。您应该使用 for 循环(不是基于范围的 for 循环)并手动跟踪nodes中的迭代器。这也可以避免重新查找要擦除的迭代器,因为您已经拥有它(并且在您擦除它时可以正确更新它)。 -
我已经更新了代码但是有一个新的错误,我找不到它发生的原因。不过谢谢你的建议,它工作得更好@1201ProgramAlarm
标签: c++ cluster-analysis unordered-map erase unordered-set