映射迭代器不是dereferencable

时间:2015-02-04 22:47:03

标签: c++ dictionary

我必须在mytextmap中找到与keymap最接近的值,对于所有keymap的元素,并在名为{{{{{}}的新map <char, char>中将其附加到彼此1}}(key的键是key的键,值是keymap的键。

这是我的尝试:

mytextmap

find_value - 返回(map.begin(),map.end())中元素的itterator值(如我的代码中的j)。

某处有错误。崩溃错误:“表达式映射/设置迭代器不能解除引用。” 问题不在擦除(已修复)。在线上它开始了。在工作之前蜇,字符串之后 - 否。

1 个答案:

答案 0 :(得分:1)

行后

keymap.erase(i);

迭代器i无效。

尝试:

for (auto i = keymap.begin(); i != keymap.end(); )
{
   int j = ((i->second) / sumkey)*sum;
   auto tmp = find_value(mytextmap.begin(), mytextmap.end(), j);
   while (tmp->second != j)
   {
      j--;
      tmp = find_value(mytextmap.begin(), mytextmap.end(), j);
   }
   key[(*tmp).second] = i->second;
   auto next = i;
   std::advance(next, 1);
   keymap.erase(i);
   i = next;
   mytextmap.erase(tmp);
}

如果您使用的是C ++ 11编译器,则可以使用:

for (auto i = keymap.begin(); i != keymap.end(); )
{
   int j = ((i->second) / sumkey)*sum;
   auto tmp = find_value(mytextmap.begin(), mytextmap.end(), j);
   while (tmp->second != j)
   {
      j--;
      tmp = find_value(mytextmap.begin(), mytextmap.end(), j);
   }
   key[(*tmp).second] = i->second;
   i = keymap.erase(i);
   mytextmap.erase(tmp);
}

更新,以回应OP的评论

我认为问题在于:

   while (tmp->second != j)
   {
      j--;
      tmp = find_value(mytextmap.begin(), mytextmap.end(), j);
   }
   key[(*tmp).second] = i->second;

tmp == mytextmap.end()时会发生什么?

我不明白你想要在这些方面完成什么。我建议您添加一些检查,以确保在tmp时无法访问tmp == mytextmap.end()