Мультикарты в C++

Я пытаюсь использовать мультикарты в С++. Основная цель состоит в том, что есть карта, которая хранит указатель мультикарты.

Теперь, когда я пытаюсь вставить в мультикарту, у меня возникает проблема. Может кто-нибудь сказать мне, где я иду не так.

typedef multimap<int,int> mm;
typedef map<int,mm*> v_map;

int main()
{
v_map map1;

v_map::iterator it;
it = map1.find(23);

mm *mm_map_pointer;

if( it == map1.end())
  {
   mm m_map1; 
   map1[23] = &m_map1;
   mm_map_pointer = &m_map1;
  }
else
 {
   mm_map_pointer = it->second; 
 }

mm_map_pointer->insert( pair<int, int>(1, 2));
return 0;
}

Проблема с mm_map_pointer->insert(pair(1, 2)); Кто-нибудь может помочь?


person learner    schedule 26.04.2011    source источник
comment
в чем проблема? ошибка компилятора? ошибка выполнения?   -  person Doug T.    schedule 26.04.2011
comment
Кто-нибудь может помочь? Если это ваш вопрос, то ответ НЕТ, потому что вы не сказали нам, какую проблему вы хотите решить. Какую ошибку вы получаете? Что происходит, когда вы пытаетесь это сделать? Что, как вы ожидали, произойдет?   -  person jalf    schedule 26.04.2011
comment
ошибка компилятора в mm_map_pointer-›insert(pair(1, 2));   -  person learner    schedule 26.04.2011
comment
Какую проблему вы получаете? Код компилируется и работает нормально (с добавлением #include <map>; using namespace std;).   -  person    schedule 26.04.2011
comment
Привет, Джалф. Проблема заключается в динамической вставке в Multimap. Я хочу, чтобы все это было внутри цикла, чтобы я мог создавать новую мультикарту, когда это необходимо.   -  person learner    schedule 26.04.2011
comment
@unapersson - хороший момент, висячий указатель не должен быть ошибкой компилятора, хотя некоторые компиляторы могут обнаружить этот случай с помощью статического анализа и выдать предупреждение. Должна быть ошибка времени выполнения.   -  person Steve314    schedule 26.04.2011
comment
@Steve Я на самом деле не читал код, просто скомпилировал и запустил его. Очевидно, что мы находимся в ситуации UB в отношении его запуска.   -  person    schedule 26.04.2011


Ответы (2)


Ваша m_map1 является локальной переменной, и вы пытаетесь сохранить указатель на нее в своей map. Это приводит к висячему указателю при выходе из блока, содержащего эту переменную.

У вас есть два способа решить эту проблему:

  • Я предпочитаю хранить multimap в map напрямую (т. е. без использования указателя). В качестве бонуса это намного упрощает ваш код:

    typedef multimap<int, int> mm;
    typedef map<int, mm> v_map;
    
    v_map map1;
    map1[23].insert(make_pair(1, 2));
    

    Вот и все!

  • Другой вариант — использовать new для создания постоянной копии файла multimap. В этом случае ваш map должен содержать shared_ptr<multimap<...> >, чтобы вам не пришлось освобождать multimap вручную.

person Chris Jester-Young    schedule 26.04.2011

{
 mm m_map1; 
 map1[23] = &m_map1;
 mm_map_pointer = &m_map1;
} // end of scope

Ваша проблема в том, что m_map1 выходит за рамки и уничтожается, оставляя вас с оборванным указателем.

person Ben Voigt    schedule 26.04.2011
comment
Спасибо, Бен, не могли бы вы мне что-нибудь предложить, как иметь динамическую мультикарту, т.е. создать мультикарту внутри цикла и инициализировать ее где угодно. - person learner; 26.04.2011
comment
@ user328560: Просто! Просто уберите звездочку из определения типа v_map. ;-) (Это магазин, к которому multimap напрямую подходит, как упоминалось в моем ответе. В качестве бонуса он также делает ваш код примерно в пять раз меньше его исходного размера.) - person Chris Jester-Young; 26.04.2011