простой способ сопоставить диапазон чисел со значением в 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}
}

person athultuttu    schedule 14.01.2020    source источник
comment
Предоставьте минимально воспроизводимый пример для вашей проблемы. Мне непонятно, что вы пытаетесь сделать.   -  person walnut    schedule 14.01.2020
comment
Всегда ли интервал в диапазонах имеет размер 10? Пожалуйста, предоставьте более подробную информацию, а также покажите свою собственную попытку (даже если она не работает)!   -  person Ajay Dabas    schedule 14.01.2020
comment
Пожалуйста, покажите работу, которую вы уже написали, и объясните, почему ваша программа не работает или не дает ожидаемых результатов. Сначала вы должны показать свою работу, и это должна быть добросовестная реальная попытка реализовать вашу задачу, а не несколько символических строк кода, прежде чем обращаться за помощью на stackoverflow.com. Для получения дополнительной информации см. раздел Как задавать вопросы, возьмите tour и прочитайте справочный центр.   -  person Sam Varshavchik    schedule 14.01.2020
comment
Что вы подразумеваете под картой диапазона? Каков тип этого диапазона? Вы хотите генерировать этот диапазон на лету, когда это необходимо, или хранить его целиком вместе с сопоставленным номером?   -  person Yksisarvinen    schedule 14.01.2020
comment
Я думаю, что ваша проблема - проблема XY.   -  person P0W    schedule 15.01.2020


Ответы (2)


Он называется Interval Map. В C++ нет встроенной структуры данных для этого, но вы можете создать свою собственную или использовать существующую реализацию.

person Rinat Veliakhmedov    schedule 14.01.2020

Мне нужно жестко закодированное отображение.

Если вы можете использовать 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

person P0W    schedule 14.01.2020
comment
Проблема в том, что когда вы добавляете перекрывающиеся диапазоны, они не объединятся. - person Rinat Veliakhmedov; 14.01.2020
comment
@Rinat OP не ясно, хочет ли он объединиться, учитывая его правки в исходной постановке задачи, кстати, в которой также не говорилось о слиянии. Это было так же просто, как поставить жестко закодированную таблицу для поиска и т. Д. - person P0W; 15.01.2020