Как обновить std:: map после использования метода find?
Как обновить значение ключа в std::map
после использования метода find
?
У меня есть объявление карты и итератора следующим образом:
map <char, int> m1;
map <char, int>::iterator m1_it;
typedef pair <char, int> count_pair;
Я использую карту для хранения количества вхождений символа.
Я использую Visual С++ 2010.
Ответы
Ответ 1
std::map::find
возвращает итератор найденному элементу (или к элементу end()
, если элемент не был найден). Пока map
не является константой, вы можете изменить элемент, на который указывает итератор:
std::map<char, int> m;
m.insert(std::make_pair('c', 0)); // c is for cookie
std::map<char, int>::iterator it = m.find('c');
if (it != m.end())
it->second = 42;
Ответ 2
Я бы использовал оператор [].
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
}
Ответ 3
Вы можете использовать функцию члена std::map::at
, она возвращает ссылку на сопоставленное значение элемента, идентифицированного с помощью ключа k.
std::map<char,int> mymap = {
{ 'a', 0 },
{ 'b', 0 },
};
mymap.at('a') = 10;
mymap.at('b') = 20;
Ответ 4
Вы также можете сделать это -
std::map<char, int>::iterator it = m.find('c');
if (it != m.end())
(*it).second = 42;
Ответ 5
using namespace std;
map<char, int> mp;
mp.insert(pair<char, int>('c', 0));
auto itr = mp.find('c');
if(itr != mp.end())
it->second = 42;
Ответ 6
Если вы уже знаете ключ, вы можете напрямую обновить значение этого ключа, используя 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
Ответ 7
Вы можете обновить значение следующим образом:
auto itr = m.find('ch');
if (itr != m.end()){
(*itr).second = 98;
}