Как обновить значение ключа std::map
после использования find
метода?
У меня есть объявление карты и итератора, подобное этому:
map <char, int> m1;
map <char, int>::iterator m1_it;
typedef pair <char, int> count_pair;
Я использую карту для хранения количества вхождений символа.
Я использую Visual C ++ 2010.
map
документации для различных функций , предоставляемыхmap
.error: assignment of member 'std::pair<char* const, char*>::second' in read-only object
:(Я бы использовал оператор [].
map <char, int> m1; m1['G'] ++; // If the element 'G' does not exist then it is created and // initialized to zero. A reference to the internal value // is returned. so that the ++ operator can be applied. // If 'G' did not exist it now exist and is 1. // If 'G' had a value of 'n' it now has a value of 'n+1'
Таким образом, используя эту технику, становится действительно легко прочитать все символы из потока и пересчитать их:
map <char, int> m1; std::ifstream file("Plop"); std::istreambuf_iterator<char> end; for(std::istreambuf_iterator<char> loop(file); loop != end; ++loop) { ++m1[*loop]; // prefer prefix increment out of habbit }
источник
[]
после использованияfind
(я не думаю, что это было вашим намерением).end()
итератор - это неопределенное поведение, ему не нужно генерироватьSIGSEGV
(и, по моему опыту, это маловероятно).Вы можете использовать
std::map::at
функцию-член, она возвращает ссылку на сопоставленное значение элемента, идентифицированного с помощью ключа k.std::map<char,int> mymap = { { 'a', 0 }, { 'b', 0 }, }; mymap.at('a') = 10; mymap.at('b') = 20;
источник
Если вы уже знаете ключ, вы можете напрямую обновить значение этого ключа, используя
m[key] = new_value
Вот пример кода, который может помочь:
map<int, int> m; for(int i=0; i<5; i++) m[i] = i; for(auto it=m.begin(); it!=m.end(); it++) cout<<it->second<<" "; //Output: 0 1 2 3 4 m[4] = 7; //updating value at key 4 here cout<<"\n"; //Change line for(auto it=m.begin(); it!=m.end(); it++) cout<<it->second<<" "; // Output: 0 1 2 3 7
источник
Вы также можете сделать это -
std::map<char, int>::iterator it = m.find('c'); if (it != m.end()) (*it).second = 42;
источник
Вы можете обновить значение следующим образом
auto itr = m.find('ch'); if (itr != m.end()){ (*itr).second = 98; }
источник