2017-02-10 18 views
1

Я работаю с полиномами и сохраняю их в std :: map как градусы и коэффициенты. Вот фрагменты кода:Ошибка уменьшения члена только для чтения при использовании std :: map

std::map<int,int> pol; 

Карта заполнена данными, а затем я начинаю ее обрабатывать.

for(std::map<int,int>::iterator it = pol.begin(); it != pol.end(); it++) { 
       if(it->first != 0) { 
         it->second *= it->first; 
         it->first--; 
       } 
       else { 
         it->first = 0; 
         it->second = 0; 
       } 
} 

И начиная с it-> first-- и дальше я получаю очень большое количество продукции с ошибками, как error: decrement of read-only member ‘std::pair<const int, int>::first’ it->first--; ^~ или error: assignment of read-only member ‘std::pair<const int, int>::first’ it->first = it->first - 1; Почему это только для чтения? Как я могу это исправить?

$ g++ --version 
g++ (Debian 6.3.0-5) 6.3.0 20170124 
+0

Возможный дубликат [force key type of std :: map не должен быть const] (http://stackoverflow.com/questions/6773734/force-key-type-of-a-stdmap-not-to- be-const) – nwp

ответ

4

Это только для чтения, потому что если вы разрешили свободно изменять ключ в карте, вы бы нарушить инвариант структуры данных на карту применения (обычно красно-черное дерево).

Вам необходимо удалить элемент и добавить его обратно с уменьшенным значением. Это гарантирует, что узел будет в правильном месте в дереве.

+0

Невозможно ли изменить значение (а не ключ) на месте? – synchronizer

+3

@synchronizer нет нет; и если вам нужно это сделать, это означает, что 'map' не является правильной структурой данных для вашего приложения. –

+0

Как же вы могли бы создать простой словарный словарь. Я почти уверен, что сделал это ... Я проверю. EDIT: Counter-example? http://stackoverflow.com/questions/4527686/how-to-update-stdmap-after-using-the-find-method – synchronizer