и получаю матюки следующего вида: error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion)
Map заполняется значениями типа make_pair('A',0.2). Не могу понять в чем дело. По какой-то причине не хочет индексироваться, хотя по идее должен.
А>и получаю матюки следующего вида: error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion)
Видимо, current передается как const&. operator[] же потенциально изменяет содержимое map.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: std::map operator []
От:
Аноним
Дата:
25.09.07 09:54
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Видимо, current передается как const&. operator[] же потенциально изменяет содержимое map.
Да. Все так и оказалось. Терь буду знать эту особенность. Большое спасибо.
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Видимо, current передается как const&. operator[] же потенциально изменяет содержимое map.
Интересно, почему нету константной версии operator[]?
Здравствуйте, Максим2006, Вы писали:
ПК>>Видимо, current передается как const&. operator[] же потенциально изменяет содержимое map. М>Интересно, почему нету константной версии operator[]?
ИМХО, чтобы не вызывать путаницы. operator[] вставляет элемент, если его не существует. А теперь представь, что существует ДВЕ версии этого оператора с очень разным поведением
Здравствуйте, Максим2006, Вы писали:
ПК>>Видимо, current передается как const&. operator[] же потенциально изменяет содержимое map.
М>Интересно, почему нету константной версии operator[]?
Наверное, потому что не вполне ясно, что делать, если требуемого элемента нет, кидать исключение?..
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: std::map operator []
От:
Аноним
Дата:
25.09.07 17:12
Оценка:
ПК>>Видимо, current передается как const&. operator[] же потенциально изменяет содержимое map. М>Интересно, почему нету константной версии operator[]?
помимо уже сказанной проблемы с несуществующим индексом еще и такая, что перегрузка по возвращаемому значению запрещена.
Re[3]: std::map operator []
От:
Аноним
Дата:
25.09.07 18:21
Оценка:
Здравствуйте, Максим2006, Вы писали:
М>Здравствуйте, Павел Кузнецов, Вы писали:
ПК>>Видимо, current передается как const&. operator[] же потенциально изменяет содержимое map. М>Интересно, почему нету константной версии operator[]?
Есть, называется итератор
// так
map<char,float>::iterator i = current.find(i->first);
// или даже так
map<char,float>::const_iterator i = current.find(i->first);
На самом деле, это очень хорошая техника обезопасить самого себя. Ибо как уже было сказано, оператор [] породит дефолтное значение, если его не было в map. И ищи потом, почему код глючит
А>На самом деле, это очень хорошая техника обезопасить самого себя. Ибо как уже было сказано, оператор [] породит дефолтное значение, если его не было в map. И ищи потом, почему код глючит
а почему б не использовать map::insert, который не вставляет элемент, если он уже есть в мапе?
Здравствуйте, Аноним, Вы писали:
М>>Интересно, почему нету константной версии operator[]?
А>помимо уже сказанной проблемы с несуществующим индексом еще и такая, что перегрузка по возвращаемому значению запрещена.
Можно подробнее?
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: std::map operator []
От:
Аноним
Дата:
27.09.07 16:48
Оценка:
Здравствуйте, Sashaka, Вы писали:
А>>На самом деле, это очень хорошая техника обезопасить самого себя. Ибо как уже было сказано, оператор [] породит дефолтное значение, если его не было в map. И ищи потом, почему код глючит
S>а почему б не использовать map::insert, который не вставляет элемент, если он уже есть в мапе?
Речь как раз о том, как избежать ненужных инсертов, если ключа в мапе нету.
А>>помимо уже сказанной проблемы с несуществующим индексом еще и такая, что перегрузка по возвращаемому значению запрещена.
ПК>Можно подробнее?
хм, был не прав. Имел ввиду что нельзя так
template <
class Key,
class Type,
class Traits = less<Key>,
class Allocator=allocator<pair <const Key, Type> >
>
class map
{
public:
Type& operator[]( const Key& _Key);
const Type& operator[](const Key& _Key);
}
но не подумал что можно дополнительно добавить const на второй оператор и все будет ок