我需要存储两个值中的矢量宽度不同的数据类型,例如:C++如何两个数据类型存储在一个矢量
vector<HWND, long> hwnd;
然后通过指数,并获得了两个值获得:
hwnd[0] // Get HWND and long
hwnd[1] // Get HWND and long
问这是一个向量解决方案还是使用hashmap解决方案是否正确?我还没有使用hashmap,这就是为什么我想知道这一点。提前致谢。
我需要存储两个值中的矢量宽度不同的数据类型,例如:C++如何两个数据类型存储在一个矢量
vector<HWND, long> hwnd;
然后通过指数,并获得了两个值获得:
hwnd[0] // Get HWND and long
hwnd[1] // Get HWND and long
问这是一个向量解决方案还是使用hashmap解决方案是否正确?我还没有使用hashmap,这就是为什么我想知道这一点。提前致谢。
边使用std::pair
是一个正确的解决方案,它失去了一些透明度,因为你将访问这样的内容:
hwnd[0].first
hwnd[0].second
这使得它完全不清楚这是一个把手,这是一个很长。
你应该使用一个结构(我使用数这里的使用情况的一个例子,你自己长可能有一个完全不同的含义):
struct HandleCount {
HWND handle;
long count;
};
所以,你的代码看起来像:
std::vector<HandleCount> hwnd;
hwnd[0].handle
hwnd[0].count
所以,当你使用一个辅助型失去了简单的一点点,你不是在理解代码简洁受益。
使用std::pair
或std::tuple
或用户定义的数据类型。
vector<pair<HWND, long>> a;
a.push_back(make_pair(val1, val2));
cout << a[0].first << endl;
cout << a[0].second << endl;
值得一提的是,对和元组的优点是它们定义了常见的运营商,如operator<
和operator==
,所以你不必重新定义它们,如果你会想说,那种矢量或者将其他操作应用于它,这将需要操作员。如果不需要,可能只需定义自己的结构。
映射用于存储键和值之间的映射,所以如果这是您真正需要的,那么就使用它。
map<int, string> mp;
mp.insert(make_pair(1, "bob"))
mp.insert(make_pair(2, "tim"))
cout << *map.find(2) << endl;
// prints "tim"
您可以使用头部声明类std::pair
<utility>
#include <vector>
#include <utility>
//...
std::vector<std::pair<HWND, long>> hwnd;
要放置元素的载体,你可以使用方法push_back
或emplace_back
例如
hwnd.emplace_back(new_hwnd, new_long);
或
hwnd.push_back({ new_hwnd, new_long });
或
hwnd.push_back(std::make_pair(new_hwnd, new_long));
来访问值可以例如
hwnd[0].first;
hwnd[0].second;
随着写C++ 11可以使用tuples做到这一点:
std::vector< std::tuple<HWND, long> > hwnd;
添加新元素以下任何一种:
hwnd.push_back({handle, count});
hwnd.push_back(std::make_tuple(handle, count));
和检索的元素与完成:
HWND handle0 = std::get<0>(hwnd[0]);
long count0 = std::get<1>(hwnd[0]);
HWND handle1 = std::get<0>(hwnd[1]);
long count1 = std::get<1>(hwnd[1]);
注意,使用元组,你不局限于两个元素。
嗯,'std :: tuple <>'并不是要取代简单的数据结构。我不太确定这是否是最佳做法。 –
其实是的,它取决于。我的意思是说,它就是使用'std :: pair'的C++ 11方法。我正在用一个不那么强烈的话来改写。谢谢! – Sigismondo
使用'std :: vector> hwnd' –
101010
一个结构体或类?这就是传统上将相关数据保存在一起的方式。 –
@JoachimPileborg是的,这是我认为的第一个,但必须有一个简单的解决方案。谢谢。 – ProtectedVoid