C++ 如何在向量中存储两种数据类型
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
因此,虽然您通过使用补充类型失去了一点简单性,但您反而受益于理解代码的简单性。
使用 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;
值得注意的是,pair 和 tuple 的优点是它们定义了常见的运算符,例如 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"
您可以使用 class std::pair
在 header <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]);
请注意,使用元组并不局限于两个元素。
我需要在向量中存储两个宽度不同的数据类型的值,示例:
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
因此,虽然您通过使用补充类型失去了一点简单性,但您反而受益于理解代码的简单性。
使用 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;
值得注意的是,pair 和 tuple 的优点是它们定义了常见的运算符,例如 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"
您可以使用 class std::pair
在 header <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]);
请注意,使用元组并不局限于两个元素。