Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно, а теперь, в очередной раз столкнулся с этим:
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>>
]
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно, а теперь, в очередной раз столкнулся с этим: ДН>
ДН>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'? В примере кода у тебя одно, в сообщении об ошибке — другое.
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Так с чем ты работаешь: 'std::map' или 'std::multimap'? В примере кода у тебя одно, в сообщении об ошибке — другое.
Извините, copy-paste плохо сделал — использую multimap
Спасибо всем, я тормоз, с чего то вдруг решил (никогда не акцентировал на этом внимание), что у multimap нет operator[], щас буду его в map<int, vector<int> > или map<int, set<int> > переделывать
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно...
Майерс писал про то, что для map'а operator[] сначала делает find(), затем insert(). Из соображений эффективности для вставок вместо operator[] лучше использовать insert().
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>>Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно...
ME>Майерс писал про то, что для map'а operator[] сначала делает find(), затем insert(). Из соображений эффективности для вставок вместо operator[] лучше использовать insert().
Примерно это меня и заставило попытаться заменить insert на operator[], но так как у меня multimap, то вызвало эту глупую ошибку.
А насчет того, что написано у Мейерса и почему я делаю замену, там вроде написано, что если ключ и, соответственно, элемент в мапе уже есть, то operator[] выгоднее, разве не так? А то я щас наделаю замен...
Здравствуйте, 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.
В остальных известных мне реализациях дело обстоит так же.
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>А насчет того, что написано у Мейерса и почему я делаю замену, там вроде написано, что если ключ и, соответственно, элемент в мапе уже есть, то operator[] выгоднее, разве не так? А то я щас наделаю замен...
Речь о том, что operator[] очень умный: если элемент есть, то возвращается он, а если нет — то создается новый.
Очень удобно, если не критична производительность.
Но если тебе вначале нужно просто заполнить мапу, то лучше использовать insert — он так и так вызовется, но зато не будет вызываться лишний find.
Здравствуйте, jazzer, Вы писали:
J>Но если тебе вначале нужно просто заполнить мапу, то лучше использовать insert — он так и так вызовется, но зато не будет вызываться лишний find.
Имхо, там было так(описываю свой случай):
если у вас есть мап, в который вы добавляете элемент с уже существующим ключом (у меня именно так), то выгодней будет использовать operator[], чем insert.
У меня был insert, щас отпрофайлил, меняю на operator[], хочу посмотреть насколько, если это так, будет выигрыш.
Здравствуйте, jazzer, Вы писали:
J>Но если тебе вначале нужно просто заполнить мапу, то лучше использовать insert — он так и так вызовется, но зато не будет вызываться лишний find.
О каком find идет речь?!
map::operator[] не использует find!!!
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Было, было... Там еще он предлагал написать какую то шибко умную функцию будет, которая будет выбирать то ли operator[] юзать, толи инсерт.
Было, но не это. Использование operator[] для заполнения map невыгодно тем, что при первой вставке (operator[] использует именно insert, а не find) будет создан объект value_type с помощью конструктора по умолчанию, который затем сразу же будет переприсврен.
Но это, как я понял, не твой случай, ток что operator[] для тебя — самое то
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, jazzer, Вы писали:
J>>Но если тебе вначале нужно просто заполнить мапу, то лучше использовать insert — он так и так вызовется, но зато не будет вызываться лишний find.
B>О каком find идет речь?! B>map::operator[] не использует find!!!
Здравствуйте, Bell, Вы писали:
B>Было, но не это. Использование operator[] для заполнения map невыгодно тем, что при первой вставке (operator[] использует именно insert, а не find) будет создан объект value_type с помощью конструктора по умолчанию, который затем сразу же будет переприсврен. B>Но это, как я понял, не твой случай, ток что operator[] для тебя — самое то B>
Наверное, я опять криво выразился... Именно то что вы сказали я и имел в виду — у меня есть уже заполненный map, но для замены value в уже существующей паре key/value я все время использовал insert, а теперь решил попробовать использовать operator[].
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.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, jazzer, Вы писали:
J>Но если тебе вначале нужно просто заполнить мапу, то лучше использовать insert — он так и так вызовется, но зато не будет вызываться лишний find.
B>О каком find идет речь?! B>map::operator[] не использует find!!!
Да, ты прав, сбили меня с толку, давно STL не пользовался :)
по Стандарту он использует insert с временным объектом, и время тратится создание его, потом присваивание, и на деструктор, а в случае чистого insert'a ничего такого не происходит.
Здравствуйте, MaximE, Вы писали:
ДН>Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно...
ME>Майерс писал про то, что для map'а operator[] сначала делает find(), затем insert(). Из соображений эффективности для вставок вместо operator[] лучше использовать insert().
Зачем это, интересно, так делать? Почему не сделать сразу 'insert'?
Здравствуйте, jazzer, Вы писали:
J>по Стандарту он использует insert с временным объектом, и время тратится создание его, потом присваивание, и на деструктор, а в случае чистого insert'a ничего такого не происходит.
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Здравствуйте, MaximE, Вы писали:
ДН>Помню, что читал что то про сабж у Мейерса, про то, что иногда его нельзя (не получается) применять, но не вник сильно...
ME>Майерс писал про то, что для map'а operator[] сначала делает find(), затем insert(). Из соображений эффективности для вставок вместо operator[] лучше использовать insert().
АТ>Зачем это, интересно, так делать? Почему не сделать сразу 'insert'?
MaximE всех сбил с толку, ничего такого Мейерс не писал :)
АТ>Зачем это, интересно, так делать? Почему не сделать сразу 'insert'?
Если ключ уже присутствет в контейнере, то обновление ассоциированного значения при использовании insert выглядит гораздо менее элегантно (нужно сохранить возвращаемую insert-ом пару, проанализировать флаг успешности вставки, и только потом произвести обновление, если это необходимо)