如何在c ++中更改内部地图的键值?

时间:2014-01-29 14:25:09

标签: c++ map stl

我在地图上工作,我有以下嵌套地图并使用一些值进行初始化:

map<string, map<int, int> > wordsMap;
map<int, int> innerMap;
map<int, int>::iterator iti;
for(int i = 2; i < argc; i++)
{
   wordsMap[argv[i]].insert(pair<int, int>(0,0));
}

经过一些处理,我试图改变内容,如果内部地图,我使用以下代码:

while(some_condition)
{
  i = 0
  for( it = wordsMap.begin() ; it != wordsMap.end(); it++)
  {
   innerMap = it->second;
   int cnt = count(words.begin(), words.end(), it->first);
   if(cnt != 0){
       wordsMap[it->first][i] = cnt;
   }
  }
  i++;
}

在上面的场景中,如何更改第一个键的值(即“0”)及其在使用另一个键值对初始化内部映射时使用的值?

2 个答案:

答案 0 :(得分:2)

您无法更改std::map中元素的键。这样做会破坏订购。

相反,您必须使用所需的键在地图中插入新元素,并从地图中删除上一个元素。

答案 1 :(得分:0)

我不确定我是否理解你的意图。我假设你要保存,

  1. <KEY : file_name, VALUE : <KEY : line, VALUE : words count>>
  2. 如果没有单词,你不想保存第二张地图。
  3. 所以,我在下面写了代码。 如果您不想显示第二个地图,只需通过不插入键值来保留空地图。 此外,由于std::map是一个关联容器,这意味着它是根据Key值保存的,因此您应该尽量避免在保存后更改键值。

    #include "stdafx.h"
    
    #include <algorithm>
    #include <string>
    #include <iostream>
    #include <vector>
    #include <map>
    
    using namespace std;
    
    typedef std::map<int, int>                  WORDS_COUNT_MAP_T;      //for line, words count
    typedef std::map<string, WORDS_COUNT_MAP_T> FILE_WORDS_COUNT_MAP_T; //for file name, WORDS_COUNT_MAP_T
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        FILE_WORDS_COUNT_MAP_T file_words_count_map;
    
        //Input dummy data for test
    
        //init file names
        std::vector<string> file_names;
        file_names.push_back("first");
        file_names.push_back("second");
        file_names.push_back("third");
    
        //get and set words count in each file
        for_each(file_names.begin(), file_names.end(), [&](const string& file_name)
        {       
            //Just for test
            WORDS_COUNT_MAP_T words_count_map;
            if(file_name == "second")
            {
                //not find words, so nothing to do
            }
            else
            {
                words_count_map[0] = 10;
                words_count_map[1] = 20;
            }
    
            file_words_count_map.insert(FILE_WORDS_COUNT_MAP_T::value_type(file_name, words_count_map));
        });
    
        //print
        for_each (file_words_count_map.begin(), file_words_count_map.end(), [&](FILE_WORDS_COUNT_MAP_T::value_type& file_words_map)
        {
            cout << "file name : " << file_words_map.first << endl;
    
            WORDS_COUNT_MAP_T words_count_map = file_words_map.second;
            for_each (words_count_map.begin(), words_count_map.end(), [](WORDS_COUNT_MAP_T::value_type& words_map)
            {
                cout << "line : " << words_map.first << ", count : " << words_map.second << endl;
            });
    
            cout << "----" << endl;
    
        });
    
        getchar();
    
        return 0;
    }
    

    此代码将如下打印, enter image description here