如何在 c++ 中存储具有值的四个参数的元组

How to store a tuple of four parameters with a value in c++

本文关键字:四个 元组 参数 c++ 存储      更新时间:2023-10-16

如何在 c++ 中存储四个带有值的参数并能够调用它。

例如,我有参数u,k,i,childEdge和一个名为val的值。

我想像这样存储它们:(5,4,6,1( = 42。

并且能够像这样访问它们:int answer = find(5,4,6,1(,所以答案将是 42

我使用的是 4D 数组,但对于大型输入,它在 c++ 中似乎不能很好地工作

所以你想要的是从四个参数到一个值的映射。您可以根据需要使用std::mapstd::unordered_map1.主要问题是如何表达四值键。以下是一些选项:

  • using MyKey = std::tuple<int, int, int, int>;

  • using MyKey = std::array<int, 4>;


  • struct Parameters { int u, k, i, childEdge; };using MyKey = Parameters;

然后,您的数据结构将是std::map<MyKey, int>std::unordered_map<MyKey, int>

我更喜欢struct选项,因为它是最清楚的。但是,您必须为std::mapstd::hash提供operator<,并为std::unordered_map提供operator==才能使用它(或等效地,使用此类函子作为映射的附加模板参数(。研究"自定义密钥 std::map"或类似内容以了解更多信息,请参阅此处或此处。

1还有其他选项,例如排序std::vector,根据您的使用模式,它们的性能可能会也可能不会优于关联容器。但这在这里跑题了。

你可以使用std::map。我相信你可以使用map.find来获得你的价值。

使用std::array作为键。您必须提供自己的哈希函数:

#include <array>
#include <boost/functional/hash.hpp>
#include <functional>
#include <iostream>
#include <unordered_map>
namespace std {
template <typename T, size_t sz>
struct hash<array<T, sz>> {
[[nodiscard]] size_t operator()(array<T, sz> const& arr) const noexcept {
return ::boost::hash_range(arr.cbegin(), arr.cend());
}
};
}  // namespace std
int main() {
std::unordered_map<std::array<int, 4>, int> m;
m[{5, 4, 6, 1}] = 42;
m[{1, 2, 3, 4}] = 1234;
m[{2, 2, 2, 2}] = 2222;
std::cout << m[{5, 4, 6, 1}] << 'n';
}

您可以使用地图,在键 5、4、6 和 1 中,值将为 42。 然后搜索函数接收参数并在地图中搜索它们。

元组和整数的映射怎么样,例如std:map<std::tuple<int, int, int, int>&, int>.这样,您将能够直接将元组用作键,因为它被存储为参考。

但是,我建议使用一种与使用tuple完全不同的方法。为什么不只为所有 5 个项目创建一个类。然后,如果您希望更好地访问这些数据,请list这些对象或std::unordered_map

如何用值存储四个参数

编写一个类:

struct Key {
int  u, k, i, childEdge;
};

类型Key的对象会将四个参数存储在一个参数中。

并且能够像这样访问它们:int 答案 = find(5,4,6,1 (

通过将值存储在关联容器中,可以将值与另一个值相关联。具体来说,要将一个值映射到另一个值,可以使用 (n 无序( 映射。标准库中有容器。您可以使用上述类作为映射的键,以有效地实现所描述的操作。