99

std::map使用该方法后如何更新键的值find

我有一个这样的地图和迭代器声明:

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

我正在使用地图来存储字符的出现次数。

我正在使用 Visual C++ 2010。

4

6 回答 6

145

std::map::find返回一个迭代器到找到的元素(或者end()如果元素没有找到)。只要map不是const,就可以修改迭代器指向的元素:

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;
于 2010-12-24T18:07:40.227 回答
59

我会使用运算符[]。

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
}
于 2010-12-24T18:20:02.830 回答
8

您可以使用std::map::at成员函数,它返回对以键 k 标识的元素的映射值的引用。

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

  mymap.at('a') = 10;
  mymap.at('b') = 20;
于 2017-08-27T10:38:35.607 回答
2

您可以像下面这样更新值

   auto itr = m.find('ch'); 
     if (itr != m.end()){
           (*itr).second = 98;
     }
于 2019-08-25T06:45:00.333 回答
0

你也可以这样做-

 std::map<char, int>::iterator it = m.find('c'); 
 if (it != m.end())
 (*it).second = 42;
于 2017-09-18T19:29:35.517 回答
0

如果您已经知道密钥,则可以使用直接更新该密钥的值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    
于 2019-07-22T15:27:33.260 回答