std::map operator []
От: Аноним  
Дата: 25.09.07 00:51
Оценка:
Ситуация такая...
map<char,float> table,current;
float fSumm=0;
...
for(map<char,float>::iterator i=table.begin();i!=table.end();i++)
      fSumm+=(i->second-current[i->first])*(i->second-current[i->first]);

и получаю матюки следующего вида: 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). Не могу понять в чем дело. По какой-то причине не хочет индексироваться, хотя по идее должен.
Re: std::map operator []
От: Павел Кузнецов  
Дата: 25.09.07 02:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>map<char,float> table,current;
А>float fSumm=0;
А>...
А>for(map<char,float>::iterator i=table.begin();i!=table.end();i++)
А>      fSumm+=(i->second-current[i->first])*(i->second-current[i->first]);
А>

А>и получаю матюки следующего вида: 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.


Да. Все так и оказалось. Терь буду знать эту особенность. Большое спасибо.
Re[2]: std::map operator []
От: Максим2006 Беларусь  
Дата: 25.09.07 11:44
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Видимо, current передается как const&. operator[] же потенциально изменяет содержимое map.

Интересно, почему нету константной версии operator[]?
Re[3]: std::map operator []
От: Аноним  
Дата: 25.09.07 11:57
Оценка: +1
Здравствуйте, Максим2006, Вы писали:

ПК>>Видимо, current передается как const&. operator[] же потенциально изменяет содержимое map.

М>Интересно, почему нету константной версии operator[]?
ИМХО, чтобы не вызывать путаницы. operator[] вставляет элемент, если его не существует. А теперь представь, что существует ДВЕ версии этого оператора с очень разным поведением
Re[3]: std::map operator []
От: Павел Кузнецов  
Дата: 25.09.07 12:05
Оценка:
Здравствуйте, Максим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. И ищи потом, почему код глючит
Re[4]: std::map operator []
От: Sashaka Россия  
Дата: 25.09.07 20:49
Оценка:
А>На самом деле, это очень хорошая техника обезопасить самого себя. Ибо как уже было сказано, оператор [] породит дефолтное значение, если его не было в map. И ищи потом, почему код глючит

а почему б не использовать map::insert, который не вставляет элемент, если он уже есть в мапе?
Re[4]: std::map operator []
От: Павел Кузнецов  
Дата: 26.09.07 01:12
Оценка:
Здравствуйте, Аноним, Вы писали:

М>>Интересно, почему нету константной версии operator[]?


А>помимо уже сказанной проблемы с несуществующим индексом еще и такая, что перегрузка по возвращаемому значению запрещена.


Можно подробнее?
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: std::map operator []
От: Аноним  
Дата: 27.09.07 16:48
Оценка:
Здравствуйте, Sashaka, Вы писали:

А>>На самом деле, это очень хорошая техника обезопасить самого себя. Ибо как уже было сказано, оператор [] породит дефолтное значение, если его не было в map. И ищи потом, почему код глючит


S>а почему б не использовать map::insert, который не вставляет элемент, если он уже есть в мапе?


Речь как раз о том, как избежать ненужных инсертов, если ключа в мапе нету.
Re[5]: std::map operator []
От: Аноним  
Дата: 27.09.07 16:54
Оценка: 1 (1)
А>>помимо уже сказанной проблемы с несуществующим индексом еще и такая, что перегрузка по возвращаемому значению запрещена.

ПК>Можно подробнее?

хм, был не прав. Имел ввиду что нельзя так
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 на второй оператор и все будет ок
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.