![](/img/trans.png)
[英]In C++, How do I store values into a vector that is inside of a vector when the two vectors are of different types?
[英]C++ How to store two data types in a vector
我需要在向量中存储宽度不同的数据类型的两个值,例如:
vector<HWND, long> hwnd;
然后按索引获取并访问两个值:
hwnd[0] // Get HWND and long
hwnd[1] // Get HWND and long
要求矢量解决方案还是使用哈希图解决方案是正确的? 我还没有使用哈希映射,这就是为什么我想知道这一点。 提前致谢。
虽然使用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
因此,尽管您通过使用补充类型失去了一些简单性,但相反,您却受益于简化代码的理解 。
您可以使用标头<utility>
声明的std::pair
类
#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;
使用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"
使用C ++ 11,您可以使用元组来实现 :
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]);
请注意,使用元组并不仅限于两个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.