具有多个值的无序地图

时间:2015-01-21 16:48:46

标签: c++ unordered-map

所以我有一个无序的地图,每个键我想存储两个独特的浮点数。这些浮点数表示我正在模拟的某些内容的累计值,因此随着我的代码的进展,可以添加现有键的值,并且可以创建新的键。

以前我只跟踪一个值,因此无序地图是简单的解决方案。我不知道如何用一个键保存两个不同的值?

  • 使用unordered_map<int,vector<float> >是我的第一个想法,但是添加到现有值并不容易。似乎我必须首先确定一个密钥是否存在,然后将新的向量分组添加到现有密钥或将密钥设置为等于新向量。
  • 我看了unordered_multimap。虽然我对它的工作原理并没有很好的感觉,但它似乎没有提供一个很好的方法来跟踪哪个值是哪个,因为我有两个值,我想保持分离并能够确定哪个是哪个。

还有其他方法可以解决这个问题吗?


使用unordered_map<int,pair<float,float> >是一个简单的解决方案。

3 个答案:

答案 0 :(得分:2)

您可以使用unordered_map< int, std::pair< float, float > >,通过该对的.first.second功能访问这些值。我不确定那是否更容易&#34;然后使用vector< float >方法。矢量方法的优点是允许您扩展以轻松存储更多值。 pair方法的优点是显式地只有两个值,只有两个值。

答案 1 :(得分:0)

如上所述,您可以同时使用vectorpair。如果值的数量是固定的,您还可以考虑创建struct。当您在单个记录中有多个数据类型的多个值时,这可能会更容易。

struct Data {
 float value1;
 float value2;
};

unordered_map<int, Data> myMap;

答案 2 :(得分:0)

你可以使用可变长度的元组

#include<iostream>
#include <iterator>
#include<map>
#include <string>
#include <vector>

using namespace std;

int main()
{

    // Defining Map  with two two values 
    map <string, tuple<int, int>> g1;

    g1.insert({"camera1", make_tuple(10,20)});
    g1.insert({"camera2", make_tuple(100,208)});
    g1.insert({"camera3", make_tuple(1000,202)});
    g1.insert({"camera4", make_tuple(102,202)});
    g1.insert({"camera5", make_tuple(104,203)});
    g1.insert({"camera6", make_tuple(109,203)});

    //print map g1
    cout<<"\nThe map g1 is : \n";
    cout <<"\n Key\tElement \n";
    
    string val = "camera7";
    
    // // Find the specific key is present if not add that
    map<string,tuple<int, int>>::iterator itr;
    
    itr = g1.find("camera7");

    if(itr ==g1.end())
    {
        cout << "Key-value pair not present in map \n" ;
        g1.insert({val, make_tuple(200,192)});
    }
    else
    {   cout<<itr->first;
        cout<<"x: "<< get<0>((itr->second));
        cout<<"y: "<< get<1>((itr->second));
    }

    // //updated value 
    cout<<"Updated Value\n";
    cout <<"\n \tKey\t\tElement1\tElement2 \n";
    for (itr=g1.begin(); itr!=g1.end();itr++)
    {
        cout<<"\t"<<itr->first<<"\t"<< get<0>(itr->second)<< " \t\t"<<get<1>(itr->second)<<"\n";
    }
    cout<<endl;

    return 0;
}