Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глупый вопрос наверное :), как добавить в std::map объект? 
:(
    Опции темы
PostEr
Дата 16.8.2003, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 30.6.2003
Где: Самара

Репутация: 1
Всего: 1



Как правильно добавить в std::map<char[256],CSomeClass> объект класса CSomeClass, если он ещё не существует? То есть что-то типа:
Код

template <class T>
class SomeTemplate
{
std::map<char[256],T> SomeMAP;

void SomeMethod(){
SomeMAP.insert("lalala",T());}

}


Это сообщение отредактировал(а) PostEr - 16.8.2003, 13:22


--------------------

------------------------------------------------------------------

[email protected]
До востребования

PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 16.8.2003, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Вот пример, используя конструктор без параметров класса COtherClass:

Код
template <class T>
class SomeTemplate
{
public:
      typedef std::map<string, T>      mymap_t;
      typedef mymap_t::value_type   mymap_vt;
      typedef mymap_t::iterator         mymap_i;

      mymap_t                                    SomeMAP;

      T& Insert(string &str_key)
      {  
             mymap_i res = SomeMAP.insert(mymap_vt(str_key, T())).first;
             return (*res).second;
      }
};

class COtherClass
{
public:
      int i;
      COtherClass() {i=123;}    // Конструктор без параметров
};

///////////////////////////////

void main()
{
      SomeTemplate<COtherClass> tmpl;
      COtherClass &New = tmpl.Insert(string("ABC"));
}


а можно и так:

Код
SomeMAP[str_key] = T();




--------------------
user posted image
PM MAIL WWW   Вверх
PostEr
Дата 16.8.2003, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 30.6.2003
Где: Самара

Репутация: 1
Всего: 1



А чем это всё отличается?
Цитата
а можно и так:

CODE
SomeMAP[str_key] = T();


Кто-то мне на этом форуме говорил - что так нельзя. Так ли это?


--------------------

------------------------------------------------------------------

[email protected]
До востребования

PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 16.8.2003, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.