繁体   English   中英

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

[英]easy way to map a range of numbers to a value in cpp

有什么方法可以将一系列数字映射到 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM