Как использовать карту STL?

У меня есть частная область

```
std::map>* the\_Map;

```

Как я могу ассигновать память для него и ввести GraphObject?
Я должен использовать нового оператора?

```
the_Map = new map>;

```

И как я могу ввести новый GraphObject?
Это - часть datastructure, и мне действительно нужен указатель на карту.

>  Как я могу ассигновать память для него и ввести GraphObject?
> 
> 
> 

Это не хочет быть указателем вообще; просто сделайте саму карту, член класса и выделения памяти произойдет автоматически.

Правильно вставка объекта довольно трудна, так как вы храните указатели там также. Если бы это не должен быть указатель, то хранить объекты сделало бы вашу жизнь намного легче. Если это действительно должен быть указатель (например, потому что `, GraphObject`  является полиморфным базовым классом), я рекомендовал бы хранить интеллектуальные указатели:  `станд.:: unique_ptr`  или  `станд.:: tr1:: shared_ptr`  или  `повышение:: shared_ptr` , если вы застреваете в прошлом.

Если вы действительно, действительно должен использовать сырые указатели по некоторой безумной причине, то самое близкое, которое можно получить к безопасной от исключения вставке, вероятно:

```
GraphObject * object = new Whatever(...);
try {
    the_Map[key].insert(object);
} catch(...) {
    delete object;
    throw;
}

```

или если вы не заботитесь о возможности утечек памяти на неудаче вставки:

```
the_Map[key].insert(new Whatever(...));

```

Также не забывайте удалять каждый объект, когда вы удалите его; этого не произойдет автоматически.

>  Мне действительно нужен указатель на карту.
> 
> 
> 

Нет вы не делаете. Но если вы действительно будете полагать, что делаете и хотите проигнорировать общий совет не к, тогда вам будет нужна фактическая карта, чтобы указать на. Я рекомендовал бы, чтобы вы сделали эту карту членом класса, так, чтобы его жизнью управляли автоматически.

Если вы действительно хотите сделать жизнь трудной для того, кто бы ни поддерживает код, то я предполагаю, что вы могли ассигновать один с `, новым` . В этом случае не забудьте удалять его, когда вы закончите с ним; вероятно, в деструкторе класса. И если вы делаете это, помните [Правило три](https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) и осуществите или удалите конструктора копии и оператор присваивания копии, так как реализации по умолчанию сделают неправильную вещь.



Почему вы храните `:: std:multiset`   `GraphObject *`  немного неясен, но позволяет рулону с этим.

Это - ответ, которому действительно тривиально отвечает документация, но нет никакого вопроса, слишком немого для StackOverflow, таким образом...

```
 the_Map = new map>;

```

Это действительно, как вы ассигнуете память для своей карты. Это обычно - не хорошая идея иметь голые указатели на вещи, лежащие вокруг, но вы настояли, и это - то, как вы делаете это. Это означает, что необходимо будет не забыть `, удаляют`  это в какой-то момент также. И необходимо будет удостовериться, что конструкция копии класса, который держит указатель, делает правильную вещь (и сказал, что правильная вещь будет справедливо сложной).

У вас есть интересная проблема теперь. Вы храните  `мультинабор`  в каждом входе карты. К счастью, этот мультинабор будет автоматически создан и инициализирован, чтобы опустеть, когда к ранее неизвестному ключу получат доступ. OTOH, ваше использование голых указателей означает, что у вас есть проблемы безопасности исключения. Возможно пропустить память, если исключение брошено где-нибудь по пути. Таким образом, необходимо поймать любые исключения и очистить объект:

```
 GraphObject *tmp = new GraphObject;
 try {
     (*the_Map)[key].insert(tmp);
 } catch (...) {
     delete tmp;
     throw;
 }

```

The fact your question is so basic makes me question your assertions about needing to use pointers. And I really wonder if you wouldn't rather have a `multimap` rather than a `map` from `string` -> `multiset`. But, you're adamant about the general form of your data structure. So the above is how you'd use it.

Я также скажу, что обильное использование этой структуры данных голых указателей - довольно плохая идея. Необходимо будет написать довольно сложные функции, чтобы правильно вскрыть противоречия или скопировать целый беспорядок.

**Edit**: *sigh* Coding at 4am on a data structure I would never create myself led me to write some very stupid code. The current version is much better. Though [this answer](https://stackoverflow.com/a/14237995/167958) is really much better than mine.