Как получить lower_bound для карты в определенном диапазоне? - PullRequest
0 голосов
/ 16 октября 2019

Я хочу найти нижний предел для моей цели на карте (в диапазоне).

Я знаю другое решение:

int main() {
  map<int,int> m;
  auto it=m.lower_bound(10);
  cout<<it->first<<" "<<it->second<<endl;
  return 0;
}

НО, я хочу, как использоватьstd::lower_bound(m.begin(),m.end(),***).

int main() {
  map<int,int> m;
  auto it=std::lower_bound(m.begin(),m.end(),10);
  cout<<it->first<<" "<<it->second<<endl;
  return 0;
}

main.cpp: 29: 43: необходимо отсюда /usr/local/Cellar/gcc/7.3.0_1/include/c++/7.3.0/bits/predefined_ops.h: 65: 22: ошибка: нет соответствия для оператора <(типы операндов: «std :: pair» и «const int») {return * __ it <__val;} </p>

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

value_type карты - std::pair<const Key,Value>, поэтому вам необходимо указать такую ​​пару в качестве аргумента.

Учитывая, что вас интересует только ключевая часть, лучше использоватьПерегрузка std::lower_bound(), которая принимает объект функции:

auto const it = std::lower_bound(m.begin(), m.end(), std::make_pair(10, 0),
                                 [](auto const& a, auto const& b){ return a.first < b.first; });

Я считаю, что при чтении документов, но не подтвердила, что мы можем использовать компаратор карты:

auto const it = std::lower_bound(m.begin(), m.end(), std::make_pair(10, 0),
                                 m.value_comp());
0 голосов
/ 16 октября 2019

Кажется, вы имеете в виду следующее

#include <iostream>
#include <map>
#include <iterator>
#include <algorithm>

int main() 
{
    std::map<int, int> m =
    {
        { 2, 1 }, { 4, 2 }, { 6, 3 }, { 8, 4 }, { 10, -1 }, { 10, 0 }, { 12, 2 } 
    };

    int key = 10;

    auto it = m.lower_bound( key );

    std::cout << "{ " << it->first << ", " << it->second << " }\n";

    it = std::lower_bound( std::begin( m ), std::end( m ), key,
                           [&]( const auto &p, const auto &value ) { return p.first < value; } );

    std::cout << "{ " << it->first << ", " << it->second << " }\n";

    return 0;
}

Вывод программы:

{ 10, -1 }
{ 10, -1 }

То есть в стандартном алгоритме std::lower_bound вы можете использовать лямбда-выражение.

...