【问题标题】:How to store/access multiple values of the same key in a map C++如何在映射 C++ 中存储/访问同一键的多个值
【发布时间】:2016-03-19 03:06:30
【问题描述】:

假设我这样声明一个 unordered_map:

unordered_map<string, vector<string>> my_map;

我有一个我想存储在其中的值列表,如下所示:

vector<string> vec1 = {"banana", "apple"}; 
vector<string> vec2 = {"banana", "banana"};
vector<string> vec3 = {"banana", "watermelon"};

如果我遍历并将每个向量初始化为地图,使用其第 0 个索引中的字符串作为键,如下所示:

my_map[vec1[0]] = vec1;
my_map[vec2[0]] = vec2;
my_map[vec3[0]] = vec3;

unordered_map 是否会存储所有三个向量,尽管它们具有相同的访问密钥?如果我想访问每个向量,有没有办法按照它们出现在上面列表中的顺序来访问?

例如,如果我这样做:

 vector<string> output1;
 vector<string> output2;
 vector<string> output3;

 output1 = my_map["banana"];
 output2 = my_map["banana"];
 output3 = my_map["banana"];

哪些向量将分配给输出 1、输出 2 和输出 3?我很确定这对所有人来说都是同一个向量,但是 unordered_map 如何决定哪一个呢?我怎样才能让 vec1 分配给 output1,vec2 分配给 output2,等等?

【问题讨论】:

    标签: c++ vector unordered-map


    【解决方案1】:

    std::unordered_map 为每个键只存储一个值 - 您分配给它的最后一个值,在您的情况下它是 vec3。如果要为每个键存储多个值,可以使用std::multimapstd::unordered_multimap

    【讨论】:

    • @Anton_Savin 感谢您的回复。我需要暂时避免使用多图,而是寻找一种方法来在普通的 unordered_map 上规避这个问题。保留一个 int 计数器变量是否合理,我会为 unordered_map 的每次添加而递增,然后将计数器添加到它的键字符串中,如下所示:水果 += 水果 + 计数器;我的地图[水果] = vec2; ?
    • @user5482356:如果显然愚蠢的“需要避免”的要求是您老师的要求,那么继续进行的一种好方法是自己实现多地图的额外功能。做起来并不难。
    【解决方案2】:

    如果 2 个元素具有相同的键,则将打印第一个键值,其他的将被忽略。

    所以试试地图地图:

    示例片段:

      std::multimap <int, xxx> stdBindListOuter;
      std::multimap <int, std::string>::iterator pos;
      std::multimap <int, xxx>::iterator posOuter;
    

    xxx-->可以自定义..

    为您的案例使用这种类型的版本更加灵活。而不是有序或无序的地图..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多