【问题标题】:BAD_ACCES iterator on map c++地图c ++上的BAD_ACCES迭代器
【发布时间】: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&lt;std::pair&lt;int,int&gt;,float&gt;
  • @Walter 不,你的答案是 XY 问题。使用嵌套地图没有任何问题,即使有更简单的处理方式 - 它不应该导致崩溃。
  • 您是否尝试过插入新的内部值对而不给出提示?那是pi_matrix.at(lj).insert(std::make_pair(li,1.f));
  • 你检查过错误发生在numb_lj[it_lj-&gt;first]还是max_pi[it_lj-&gt;first]?由于您未能制作 MVCE,我无法确定。也许在这里用.at(i) 替换[i] 来检查访问冲突。
  • @Walter 如果提示不正确也没关系,这只是一种优化 - 无论提示如何,都应始终使用正确的插入点。

标签: c++ loops dictionary iterator segmentation-fault


【解决方案1】:

您的嵌套map 设计似乎导致了各种不必要的复杂性。更自然地出现以pair&lt;int,int&gt; 为键的单个地图:

using key_type = std::pair<int,int>;
using map_type = std::map<key_type,float>;

void add_to_map(map_type&map, key_type const&key)
{
    map[key] += 1.f;   // also works as desired if map.count(key)==0
}

// find key and value of first element with maximum value
map_type::value_type find_max(map_type const&map)
{
    auto max = map.begin();
    for(auto it=max; it!=map.end(); ++it)
        if(it.second > max.second)
            max = it;
    return *max;
}

无需纠结map::countmap::iterator

【讨论】:

  • 感谢您的回答!确实它更简单..我用你的方法重写了它,它做了它应该做的事情,但是在几次迭代后再次崩溃并出现分段错误..
  • 我们同意我在这里使用的所有东西都将在函数结束时被销毁,因为我没有使用任何“新”?
  • @mbuffier 哪个函数?你没有功能!所以什么都不会被破坏。我认为这个映射是一个类的成员,因此它的生命周期是相应类对象的。
  • @mbuffier 请发帖和MCVE。就目前而言,我们无法真正帮助您。而且,该帖子对其他人无用,因此容易被关闭。根据您的评论,该错误似乎不在map 的使用中,而是在其他地方(正如我在问题的 cmets 中建议的那样)。
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多