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

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

std::map>* the_Map;

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

the_Map = new map>;

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

1
nl ja de
Во-первых, вам действительно нужен указатель на карту? Во-вторых, у вас есть доступ к документации?
добавлено автор Luchian Grigore, источник
станд.:: карта <станд.:: последовательность, станд.:: мультинабор > the_Map; (не указатель, никакой , новый , нет ничто) просто, работает.
добавлено автор R. Martinho Fernandes, источник
Напоминает мне о Bjarne' s комментарий: "Если that' s C++, я ненавижу его также". Используя указатель вместо (авто класс памяти) объект карты не делает ничего, чтобы сделать его более доступным для целого класса.
добавлено автор Jerry Coffin, источник
Почему вы объявили свою область как указатель во-первых?
добавлено автор Omnifarious, источник
Я can' t изменяют область. It' s часть структуры данных, и мне нужен доступ к карте в целом классе.
добавлено автор user1819636, источник
Я должен использовать его. It' s не мое внедрение. Как может я вставлять новые объекты в станд.:: карта <станд.:: последовательность, станд.:: мультинабор >* the_Map;?
добавлено автор user1819636, источник

2 ответы

Как я могу ассигновать память для него и ввести 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(...));

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

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

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

Если вы действительно хотите сделать жизнь трудной для того, кто бы ни поддерживает код, то я предполагаю, что вы могли ассигновать один с , новым . В этом случае не забудьте удалять его, когда вы закончите с ним; вероятно, в деструкторе класса. И если вы делаете это, помните Правило три и осуществите или удалите конструктора копии и оператор присваивания копии, так как реализации по умолчанию сделают неправильную вещь.

2
добавлено
Это - намного лучший ответ, чем мой.
добавлено автор Omnifarious, источник

Почему вы храните :: 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 is really much better than mine.

2
добавлено
В то время как я соглашаюсь с вашими комментариями по поводу использования указателей, в этом случае, он должен быть в состоянии просто сделать (*the_Map) [ключ] .insert (новый GraphObject) без поиска. Если это будет существовать, то [] возвратит ссылку на него. Если это doesn' t существуют, это создает новый пустой мультинабор.
добавлено автор Dave S, источник
@DaveS: хлопает лоб You' право ре! Слишком много программирования Питона для меня.
добавлено автор Omnifarious, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest