具有多个值的无序映射
Unordered map with multiple values
所以我有一个无序映射,我想为每个键存储两个唯一的浮点数。这些浮点数表示我正在模拟的东西随时间的聚合值,因此随着我的代码的进展,它们可能会添加现有键的值,并且可能会创建新的键。
以前我只跟踪一个值,因此无序映射是简单的解决方案。我不确定如何用一个键保存两个不同的值?
- 使用
unordered_map<int,vector<float> >
是我的第一个想法,但添加到现有值并不那么容易。看来我必须先确定一个键是否存在,然后将新向量按分量添加到现有向量中,或者将键设置为等于新向量。
- 我看了unordered_multimap。尽管我对它的工作原理不太了解,但它似乎没有提供一种很好的方法来跟踪哪个值是哪个,因为我有两个值,我想将它们分开并能够确定哪个是哪个。
还有其他方法吗?
使用 unordered_map<int,pair<float,float> >
是一个简单的解决方案。
您可以使用 unordered_map< int, std::pair< float, float > >
,通过对的 .first
和 .second
函数访问值。我不确定那是 "easier" 然后使用 vector< float >
方法。矢量方法的优点是允许您轻松扩展以存储更多值。 pair
方法的优点是明确有两个值和只有两个值。
如前所述,您可以同时使用 vector
和 pair
。如果值的数量是固定的,您还可以考虑创建一个 struct
。当您在单个记录中有来自多种数据类型的多个值时,这可能会更容易。
struct Data {
float value1;
float value2;
};
unordered_map<int, Data> myMap;
您可以使用可变长度的元组
#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;
}
所以我有一个无序映射,我想为每个键存储两个唯一的浮点数。这些浮点数表示我正在模拟的东西随时间的聚合值,因此随着我的代码的进展,它们可能会添加现有键的值,并且可能会创建新的键。
以前我只跟踪一个值,因此无序映射是简单的解决方案。我不确定如何用一个键保存两个不同的值?
- 使用
unordered_map<int,vector<float> >
是我的第一个想法,但添加到现有值并不那么容易。看来我必须先确定一个键是否存在,然后将新向量按分量添加到现有向量中,或者将键设置为等于新向量。 - 我看了unordered_multimap。尽管我对它的工作原理不太了解,但它似乎没有提供一种很好的方法来跟踪哪个值是哪个,因为我有两个值,我想将它们分开并能够确定哪个是哪个。
还有其他方法吗?
使用 unordered_map<int,pair<float,float> >
是一个简单的解决方案。
您可以使用 unordered_map< int, std::pair< float, float > >
,通过对的 .first
和 .second
函数访问值。我不确定那是 "easier" 然后使用 vector< float >
方法。矢量方法的优点是允许您轻松扩展以存储更多值。 pair
方法的优点是明确有两个值和只有两个值。
如前所述,您可以同时使用 vector
和 pair
。如果值的数量是固定的,您还可以考虑创建一个 struct
。当您在单个记录中有来自多种数据类型的多个值时,这可能会更容易。
struct Data {
float value1;
float value2;
};
unordered_map<int, Data> myMap;
您可以使用可变长度的元组
#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;
}