Как обновить std :: map после использования метода find? - PullRequest
79 голосов
/ 24 декабря 2010

Как обновить значение ключа в std::map после использования метода find?

У меня есть объявление карты и итератора, подобное этому:

map <char, int> m1;
map <char, int>::iterator m1_it;
typedef pair <char, int> count_pair;

Я использую карту для хранения количества вхождений персонажа.

Я использую Visual C ++ 2010.

Ответы [ 4 ]

112 голосов
/ 24 декабря 2010

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;
36 голосов
/ 24 декабря 2010

Я бы использовал оператор [].

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 голосов
/ 27 августа 2017

Вы можете использовать std::map::at функцию-член, она возвращает ссылку на сопоставленное значение элемента, обозначенного ключом k.

std::map<char,int> mymap = {
                               { 'a', 0 },
                               { 'b', 0 },
                           };

  mymap.at('a') = 10;
  mymap.at('b') = 20;
0 голосов
/ 18 сентября 2017

Вы также можете сделать это-

 std::map<char, int>::iterator it = m.find('c'); 
 if (it != m.end())
 (*it).second = 42;
...