2015-10-30 93 views
0

我需要存储两个值中的矢量宽度不同的数据类型,例如:C++如何两个数据类型存储在一个矢量

vector<HWND, long> hwnd; 

然后通过指数,并获得了两个值获得:

hwnd[0] // Get HWND and long 
hwnd[1] // Get HWND and long 

问这是一个向量解决方案还是使用hashmap解决方案是否正确?我还没有使用hashmap,这就是为什么我想知道这一点。提前致谢。

+1

使用'std :: vector > hwnd' – 101010

+2

一个结构体或类?这就是传统上将相关数据保存在一起的方式。 –

+0

@JoachimPileborg是的,这是我认为的第一个,但必须有一个简单的解决方案。谢谢。 – ProtectedVoid

回答

6

边使用std::pair是一个正确的解决方案,它失去了一些透明度,因为你将访问这样的内容:

hwnd[0].first 
hwnd[0].second 

这使得它完全不清楚这是一个把手,这是一个很长。

你应该使用一个结构(我使用数这里的使用情况的一个例子,你自己长可能有一个完全不同的含义):

struct HandleCount { 
    HWND handle; 
    long count; 
}; 

所以,你的代码看起来像:

std::vector<HandleCount> hwnd; 

hwnd[0].handle 
hwnd[0].count 

所以,当你使用一个辅助型失去了简单的一点点,你不是在理解代码简洁受益。

0

使用std::pairstd::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" 
1

您可以使用头部声明类std::pair<utility>

#include <vector> 
#include <utility> 

//... 

std::vector<std::pair<HWND, long>> hwnd; 

要放置元素的载体,你可以使用方法push_backemplace_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; 
0

随着写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]); 

注意,使用元组,你不局限于两个元素。

+2

嗯,'std :: tuple <>'并不是要取代简单的数据结构。我不太确定这是否是最佳做法。 –

+0

其实是的,它取决于。我的意思是说,它就是使用'std :: pair'的C++ 11方法。我正在用一个不那么强烈的话来改写。谢谢! – Sigismondo

相关问题