C ++如何在向量中存储两种数据类型

时间:2015-10-30 10:41:11

标签: c++ vector hashmap dimension

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

vector<HWND, long> hwnd;

然后通过索引获取并访问这两个值:

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

请求向量解决方案或者使用hashmap解决方案是否正确?我还没有使用hashmap这就是为什么我想知道这个。提前谢谢。

4 个答案:

答案 0 :(得分:6)

虽然使用std::pair是一个正确的解决方案,但它会失去一些清晰度,因为你会访问这样的元素:

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

这使得它绝对不清楚哪个是句柄,哪个是长的。

你应该使用一个结构(我在这里使用count作为用例的例子,你自己的long可能有完全不同的含义):

struct HandleCount {
    HWND handle;
    long count;
};

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

std::vector<HandleCount> hwnd;

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

因此,虽然您通过使用补充类型而失去了一点简单性,但您可以简化理解代码。

答案 1 :(得分: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; 

答案 2 :(得分: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"

答案 3 :(得分: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]);

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