Как использвать lower_bound и upper_bound для поиска по интервалу?

Имеется map, нужно с помощью двух функций lower_bound и upper_bound задать интервал поиска для ключевых значений.

#include <iostream>
#include <map>
#include <locale.h>
#include <stdlib.h>
using namespace std;

int main()
{
    //Одноаспектный поиск по совпадению
    setlocale(LC_ALL, "RUS");
    struct info
    {
        int numbers[2]; //значение объёма массива для всех значений должен быть const
        char CHAR;
    };
    char name;
    int i, n;
    map <char, info> mp = { {'H', {1 , 5, 'h'}}, 
                            {'K', {2 , 3, 'k'}},
                            {'A', {2 , 4, 'a'}},
                            {'C', {5 , 6, 'c'}},
                            {'D', {9 , 0, 'd'}},
                            {'S', {3 , 4, 's'}} };

    cin >> name;
    for (i = 0; i <= 2-1; i++)
        cout << mp[name].numbers[i] << " ";
    cout << mp[name].CHAR;
    //Одноаспектный поиск по интервалу  
    
    return 0;
}

Ответы (1 шт):

Автор решения: AR Hovsepyan

Как известно std::map содержит элементы с уникальным ключом(не более одного элемента с тем же ключом). Поэтому для поиска не имеет смысла попытка нахождения нижней и верхней границы элементов с одинаковым ключом.

Но если все же хотите проводить испытания, то нужно помнить, что std::lower_bound ищет элемент, не меньший указанного объекта, а std::upper_bound найдет первый элемент, который точно больше. То есть, если алгоритм std::lower_bound вернул итератор For, указывающий не за конец карты, то std::upper_bound для std::map вернет ++For, так что тут использование сразу двух алгоритмов есть бессмысленная трата времени. Но все же, вернемся к вашему вопросу. Насколько я понял, вы хотите что то вроде:

   //порядок аргументов предикатов важен
   auto   pred1 = 
    [](const std::pair<char, info> p, const char key)
    { return p.first < key; };
   auto   pred2 = 
    [](const char key, const std::pair<char, info> p)
    {return  key < p.first; };
//для удобства записи, определим макрос
#define ARGS  mp.begin(), mp.end(), name  
    auto 
    lb = std::lower_bound(ARGS, pred1),
    ub = std::upper_bound(ARGS, pred2);
#undef ARGS
    if (lb != mp.end())
        cout << "info  corresponding to the key\n"
        << lb->second.numbers[0] << ' '
        << lb->second.numbers[1]
        << ' ' << lb->second.CHAR;
    if (ub != mp.end())
        cout  << "\ninfo from next object\n"
        << ub->second.numbers[0] << ' ' 
        << ub->second.numbers[1]
        << ' ' << ub->second.CHAR;   
→ Ссылка