operator[] для std::map
От: Дмитрий Наумов  
Дата: 29.04.03 07:59
Оценка:
Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно, а теперь, в очередной раз столкнулся с этим:
map<int, int> m_Dictionary;
//...
m_Dictionary[key.intVal] = value.intVal;


e:\xxx\DMNTable.cpp(93): error C2676: binary '[' : 'std::multimap<_Kty,_Ty,_Pr,_Alloc>' does not define this operator or a conversion to a type acceptable to the predefined operator
with
[
_Kty=int,
_Ty=int,
_Pr=std::less<int>,
_Alloc=std::allocator<std::pair<const int,int>>
]


Никто не просветлит мои мозги?
... << RSDN@Home 1.0 beta 6a >>
Re: operator[] для std::map
От: Аноним  
Дата: 29.04.03 08:01
Оценка: 12 (1)
Здравствуйте, Дмитрий Наумов,

У вас multimap, а не map. Если верить сообщению об ошибке.

multimap не содержит оператора [].
Re: operator[] для std::map
От: Андрей Тарасевич Беларусь  
Дата: 29.04.03 08:02
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно, а теперь, в очередной раз столкнулся с этим:

ДН>
ДН>map<int, int> m_Dictionary;
ДН>//...
ДН>m_Dictionary[key.intVal] = value.intVal;
ДН>


ДН>

ДН>e:\xxx\DMNTable.cpp(93): error C2676: binary '[' : 'std::multimap<_Kty,_Ty,_Pr,_Alloc>' does not define this operator or a conversion to a type acceptable to the predefined operator
ДН> with
ДН> [
ДН> _Kty=int,
ДН> _Ty=int,
ДН> _Pr=std::less<int>,
ДН> _Alloc=std::allocator<std::pair<const int,int>>
ДН> ]


ДН>Никто не просветлит мои мозги?


Так с чем ты работаешь: 'std::map' или 'std::multimap'? В примере кода у тебя одно, в сообщении об ошибке — другое.
Best regards,
Андрей Тарасевич
Re[2]: operator[] для std::map
От: Дмитрий Наумов  
Дата: 29.04.03 08:04
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Так с чем ты работаешь: 'std::map' или 'std::multimap'? В примере кода у тебя одно, в сообщении об ошибке — другое.


Извините, copy-paste плохо сделал — использую multimap
... << RSDN@Home 1.0 beta 6a >>

Удалено избыточное цитирование. -- ПК.
Re[3]: operator[] для std::map
От: Lorenzo_LAMAS  
Дата: 29.04.03 08:05
Оценка: 12 (1)
Дак у него и нету оператора []
Of course, the code must be complete enough to compile and link.
Re: operator[] для std::map
От: Bell Россия  
Дата: 29.04.03 08:05
Оценка: 12 (1)
Здравствуйте, Дмитрий Наумов, Вы писали:

Судя по тексту ошибки используется multimap, а этот контейнер operator[] не имеет.
Любите книгу — источник знаний (с) М.Горький
Re: operator[] для std::map
От: Дмитрий Наумов  
Дата: 29.04.03 08:08
Оценка:
Спасибо всем, я тормоз, с чего то вдруг решил (никогда не акцентировал на этом внимание), что у multimap нет operator[], щас буду его в map<int, vector<int> > или map<int, set<int> > переделывать
... << RSDN@Home 1.0 beta 6a >>
Re: operator[] для std::map
От: MaximE Великобритания  
Дата: 29.04.03 08:09
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно...


Майерс писал про то, что для map'а operator[] сначала делает find(), затем insert(). Из соображений эффективности для вставок вместо operator[] лучше использовать insert().
Re[2]: operator[] для std::map
От: Дмитрий Наумов  
Дата: 29.04.03 08:12
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, Дмитрий Наумов, Вы писали:


ДН>>Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно...


ME>Майерс писал про то, что для map'а operator[] сначала делает find(), затем insert(). Из соображений эффективности для вставок вместо operator[] лучше использовать insert().


Примерно это меня и заставило попытаться заменить insert на operator[], но так как у меня multimap, то вызвало эту глупую ошибку.
А насчет того, что написано у Мейерса и почему я делаю замену, там вроде написано, что если ключ и, соответственно, элемент в мапе уже есть, то operator[] выгоднее, разве не так? А то я щас наделаю замен...
... << RSDN@Home 1.0 beta 6a >>
Re[2]: operator[] для std::map
От: Bell Россия  
Дата: 29.04.03 08:15
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, Дмитрий Наумов, Вы писали:


ДН>Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно...


ME>Майерс писал про то, что для map'а operator[] сначала делает find(), затем insert(). Из соображений эффективности для вставок вместо operator[] лучше использовать insert().


Что-то не припомню я этого у Майерса
По-моему речь там у него шла несколько о другом...

MSDN
map::operator[]
A::reference operator[](const Key& key);

The member function determines the iterator it as the return value of insert( value_type(key, T()). 
(It inserts an element with the specified key if no such element exists.) 
It then returns a reference to (*it). second.


В остальных известных мне реализациях дело обстоит так же.
Любите книгу — источник знаний (с) М.Горький
Re[3]: operator[] для std::map
От: jazzer Россия Skype: enerjazzer
Дата: 29.04.03 08:17
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>А насчет того, что написано у Мейерса и почему я делаю замену, там вроде написано, что если ключ и, соответственно, элемент в мапе уже есть, то operator[] выгоднее, разве не так? А то я щас наделаю замен...


Речь о том, что operator[] очень умный: если элемент есть, то возвращается он, а если нет — то создается новый.
Очень удобно, если не критична производительность.

Но если тебе вначале нужно просто заполнить мапу, то лучше использовать insert — он так и так вызовется, но зато не будет вызываться лишний find.

Удалено избыточное цитирование. -- ПК.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: operator[] для std::map
От: Дмитрий Наумов  
Дата: 29.04.03 08:20
Оценка:
Здравствуйте, Bell, Вы писали:

B>Что-то не припомню я этого у Майерса

B>По-моему речь там у него шла несколько о другом...

Было, было... Там еще он предлагал написать какую то шибко умную функцию будет, которая будет выбирать то ли operator[] юзать, толи инсерт.
... << RSDN@Home 1.0 beta 6a >>

Удалено избыточное цитирование. -- ПК.
Re[4]: operator[] для std::map
От: Дмитрий Наумов  
Дата: 29.04.03 08:22
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Но если тебе вначале нужно просто заполнить мапу, то лучше использовать insert — он так и так вызовется, но зато не будет вызываться лишний find.


Имхо, там было так(описываю свой случай):
если у вас есть мап, в который вы добавляете элемент с уже существующим ключом (у меня именно так), то выгодней будет использовать operator[], чем insert.

У меня был insert, щас отпрофайлил, меняю на operator[], хочу посмотреть насколько, если это так, будет выигрыш.
... << RSDN@Home 1.0 beta 6a >>

Удалено избыточное цитирование. -- ПК.
Re[4]: operator[] для std::map
От: Bell Россия  
Дата: 29.04.03 08:25
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Но если тебе вначале нужно просто заполнить мапу, то лучше использовать insert — он так и так вызовется, но зато не будет вызываться лишний find.


О каком find идет речь?!
map::operator[] не использует find!!!
Любите книгу — источник знаний (с) М.Горький
Re[4]: operator[] для std::map
От: Bell Россия  
Дата: 29.04.03 08:31
Оценка: 6 (1)
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Было, было... Там еще он предлагал написать какую то шибко умную функцию будет, которая будет выбирать то ли operator[] юзать, толи инсерт.


Было, но не это. Использование operator[] для заполнения map невыгодно тем, что при первой вставке (operator[] использует именно insert, а не find) будет создан объект value_type с помощью конструктора по умолчанию, который затем сразу же будет переприсврен.
Но это, как я понял, не твой случай, ток что operator[] для тебя — самое то
Любите книгу — источник знаний (с) М.Горький
Re[5]: operator[] для std::map
От: MaximE Великобритания  
Дата: 29.04.03 08:32
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, jazzer, Вы писали:


J>>Но если тебе вначале нужно просто заполнить мапу, то лучше использовать insert — он так и так вызовется, но зато не будет вызываться лишний find.


B>О каком find идет речь?!

B>map::operator[] не использует find!!!

Тогда опиши алгоритм его работы.
Re[5]: operator[] для std::map
От: Дмитрий Наумов  
Дата: 29.04.03 08:36
Оценка:
Здравствуйте, Bell, Вы писали:

B>Было, но не это. Использование operator[] для заполнения map невыгодно тем, что при первой вставке (operator[] использует именно insert, а не find) будет создан объект value_type с помощью конструктора по умолчанию, который затем сразу же будет переприсврен.

B>Но это, как я понял, не твой случай, ток что operator[] для тебя — самое то
B>

Наверное, я опять криво выразился... Именно то что вы сказали я и имел в виду — у меня есть уже заполненный map, но для замены value в уже существующей паре key/value я все время использовал insert, а теперь решил попробовать использовать operator[].
... << RSDN@Home 1.0 beta 6a >>
Re[6]: operator[] для std::map
От: Bell Россия  
Дата: 29.04.03 08:37
Оценка: 9 (1)
Здравствуйте, MaximE, Вы писали:

Вот кусок из документации на SGI STL:

Note that the definition of operator[] is extremely simple: m[k] is equivalent to 
(*((m.insert(value_type(k, data_type()))).first)).second. Strictly speaking, 
this member function is unnecessary: it exists only for convenience.
Любите книгу — источник знаний (с) М.Горький
Re[5]: operator[] для std::map
От: jazzer Россия Skype: enerjazzer
Дата: 29.04.03 08:37
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, jazzer, Вы писали:


J>Но если тебе вначале нужно просто заполнить мапу, то лучше использовать insert — он так и так вызовется, но зато не будет вызываться лишний find.


B>О каком find идет речь?!

B>map::operator[] не использует find!!!

Да, ты прав, сбили меня с толку, давно STL не пользовался :)

по Стандарту он использует insert с временным объектом, и время тратится создание его, потом присваивание, и на деструктор, а в случае чистого insert'a ничего такого не происходит.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: operator[] для std::map
От: Андрей Тарасевич Беларусь  
Дата: 29.04.03 08:39
Оценка:
Здравствуйте, MaximE, Вы писали:

ДН>Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно...


ME>Майерс писал про то, что для map'а operator[] сначала делает find(), затем insert(). Из соображений эффективности для вставок вместо operator[] лучше использовать insert().


Зачем это, интересно, так делать? Почему не сделать сразу 'insert'?
Best regards,
Андрей Тарасевич
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.