【发布时间】:2017-11-24 17:51:37
【问题描述】:
我正在尝试使用这样的地图中的地图来实现一个功能:
typedef std::map<int, float> inner_map;
typedef std::map<int, inner_map> outer_map;
我正在以这种方式填充地图。这个想法是第一个映射包含一个 int 键和一个包含另一个键和一个浮点数的另一个映射。如果我获得的对是已知的,我会增加值,否则我会填充地图。
for (int y = 2; y < imgSize.y - 2; y++){
for (int x = 2; x < imgSize.x - 2; x++) {
thisPos = x + y*imgSize.x ;
{SOME CODE}
lj = labelMap[thisPos] ;
if (condition) {
// get the 2 label
li = pro_label_mod[thisPos] ;
// look if it lj is in the map
is_lj = pi_matrix.count(lj) ;
// this lj has already been observed
if (is_lj == 1) {
is_li = pi_matrix[lj].count(li);
// this pair is known -> I increment
if (is_li==1) {
pi_matrix[lj][li] += 1.0f ;
}
else {
pi_matrix.at(lj).insert(pi_matrix[lj].end(), std::make_pair(li, 1.0f)) ;
}
}
else {
inner_map inter ; inter.insert(std::make_pair(li, 1.0f)) ;
pi_matrix.emplace(lj, inter) ;
}
}
numb_lj[lj] += 1.0f ;
}
}
然后,我想在我的代码中遍历地图。我用迭代器做到了这一点,例如:
std::vector<std::pair<int,float> > max_pi(size_lj) ;
float maxValue, thisValue ; int label_max ;
for (outer_map::iterator it_lj = pi_matrix.begin(), it_lj_end = pi_matrix.end(); it_lj != it_lj_end; ++it_lj) {
maxValue = 0.0f ;
label_max = 0 ;
inner_map &innerMap = it_lj->second;
for(inner_map::iterator it_li = innerMap.begin(), it_li_end = innerMap.end(); it_li != it_li_end; ++it_li) {
thisValue = it_li->second / numb_lj[it_lj->first] ;
if (thisValue >= maxValue) {
maxValue = thisValue ;
label_max = it_li->first ;
}
}
max_pi[it_lj->first] = std::make_pair(label_max, maxValue) ;
i+=1;
}
但是,我在 for 循环的行(第一个或第二个)处遇到了分段错误。但 !不是每次。我在每一帧都调用这个函数,我可以在没有 BAD_ACCESS 的情况下进行 5 次调用,但突然间,它崩溃了。有时在第一次调用之后,然后是第 10 次。
我真的不明白为什么以及如何解决它..
提前感谢您提供任何可能有用的线索/cmets!
【问题讨论】:
-
这是一个典型的XY problem。由于嵌套地图的奇怪设计,您的复杂性出现了。为什么不简单地使用单个地图,例如
std::map<std::pair<int,int>,float>? -
@Walter 不,你的答案是 XY 问题。使用嵌套地图没有任何问题,即使有更简单的处理方式 - 它不应该导致崩溃。
-
您是否尝试过插入新的内部值对而不给出提示?那是
pi_matrix.at(lj).insert(std::make_pair(li,1.f)); -
你检查过错误发生在
numb_lj[it_lj->first]还是max_pi[it_lj->first]?由于您未能制作 MVCE,我无法确定。也许在这里用.at(i)替换[i]来检查访问冲突。 -
@Walter 如果提示不正确也没关系,这只是一种优化 - 无论提示如何,都应始终使用正确的插入点。
标签: c++ loops dictionary iterator segmentation-fault