将一系列数字映射到 CPP 中的值的简单方法

easy way to map a range of numbers to a value in cpp

本文关键字:简单 方法 CPP 一系列 数字 映射      更新时间:2023-10-16

有没有办法将一系列数字映射到 cpp 中的特定数字或值,如下所示:

1-10 : 15

10-20 : 05

范围将是连续的数字。 该值可以是任何随机数。 无法对范围进行算术计算来得出该值。 没有这种关系。我需要一个硬编码映射。

更新: 我熟悉地图。考虑像下面这样的地图。

{
{1,10}
{2,10}
{3,10}
...
{10,10}
{11,20}
{12,20}
...
{15,20}
{16,30}
{17,30}
{18,30}
}

我不是为每个数字执行此操作,而是想对范围执行此操作,因为对于连续数字的值是相同的,如下所示。

{
{1 to 10  ,10}
{11 to 15 ,20}
{16 to 18 ,30}
}

有什么办法可以做到这一点。

我知道一种方法是定义数组中的下限和上限,并将输入与它们进行比较。

{
{1,10,10},
{11,15,20},
{15,18,30}
}

它被称为Interval Map。C++中没有内置的数据结构,但您可以创建自己的或使用现有实现。

我需要一个硬编码的映射。

如果可以使用 boost,则可以执行以下操作:

std::unordered_map<std::pair<int, int>, int, boost::hash<std::pair<int, int>>> myMap = {
{ { 1,  10} , 15 },
{ { 10, 20} , 5 },    
};

否则,您必须为std::pair提供哈希

// A trivial hash function used to hash a pair
struct hash_pair { 
template <class T1, class T2> 
size_t operator()(const pair<T1, T2>& p) const
{ 
auto hash1 = hash<T1>{}(p.first); 
auto hash2 = hash<T2>{}(p.second); 
return hash1 ^ hash2; 
} 
}; 
std::unordered_map<std::pair<int, int>, int, hash_pair> myMap = {
{ { 1,  10} , 15 },
{ { 10, 20} , 5 },    
};

Demo Here