-2

I have to find in mytextmap the closest value to keymap, for all keymap's elements and attach it to each other in a new map <char, char> called key(key of key is key of keymap, value is key of mytextmap).

Here my attempt:

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);
}

find_value - returns an itterator for element in (map.begin(), map.end()) with value(like j in my code).

There is an error, somewhere. Crash error: "expression map/set iterator not dereferencable.
Problem is not in erase(already fixed). On while-line it crahes. Sting before works, string after - no.

Cœur
  • 37,241
  • 25
  • 195
  • 267

1 Answers1

1

After the line

keymap.erase(i);

the iterator, i, is invalid.

Try:

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);
}

If you are using a C++11 compiler, you can use:

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);
}

Update, in response to OP's comment

I think the problem lies in the lines:

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

What happens when tmp == mytextmap.end()?

I don't understand what you are trying to accomplish in those lines. I suggest you add some checks that make sure that you don't access tmp when tmp == mytextmap.end().

R Sahu
  • 204,454
  • 14
  • 159
  • 270