![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| PostEr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 282 Регистрация: 30.6.2003 Где: Самара Репутация: 1 Всего: 1 |
Как правильно добавить в std::map<char[256],CSomeClass> объект класса CSomeClass, если он ещё не существует? То есть что-то типа:
Это сообщение отредактировал(а) PostEr - 16.8.2003, 13:22 -------------------- ------------------------------------------------------------------ [email protected] До востребования |
|||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Вот пример, используя конструктор без параметров класса COtherClass:
а можно и так:
-------------------- ![]() |
||||
|
|||||
| PostEr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 282 Регистрация: 30.6.2003 Где: Самара Репутация: 1 Всего: 1 |
А чем это всё отличается?
Кто-то мне на этом форуме говорил - что так нельзя. Так ли это? -------------------- ------------------------------------------------------------------ [email protected] До востребования |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Отличается во-первых тем, что ты не контролируешь ситуацию, когда возможна попытка добавить новый "ключ+значение" "поверх" существующего. В этой ситуации в списке останутся старые ключ и значение, а ты никак об этом не узнаешь (в отличие от метода insert, возвращающего пару "bool+T", где булева переменная хранит "true" если элемент успешно добавлен).
Во-вторых, если такую конструкцию использовать как r-value (т.е. "T &retrieved = SomeMAP[str_key]"), то возможна ситуация (опять-таки неотслеживаемая), когда при отсутствии данного ключа в список будет добавлена пара "ключ+значение", со значением, определяемым конструктором по умолчанию. Так что, если хочешь сделать код корректнее (и проще для понимания), используй вместо квадратных скобок методы "insert" и "find". Кроме того, работа с присвоениями типа "SomeMAP[str_key] = T();" ставит вопрос быстродействия, т.к. реально в список в этом случае добавляется копия объекта (созданного по "T()"), а не сам экземпляр. Т.е. выделение памяти и вызов конструктора происходит 2 раза вместо одного. Можно хранить в списке не объекты, а указатели на них (тогда будет "SomeMAP[str_key] = new T();", но тебе придется вручную вызывать деструкторы для каждого указателя при освобождении памяти). Это сообщение отредактировал(а) mr.DUDA - 16.8.2003, 15:51 -------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |