Как использовать `std :: lower_bound` с` std :: map`? - PullRequest
1 голос
/ 07 октября 2019

У меня есть вопрос:

У меня есть std::map строк в целые числа, представляющие список фруктов:

map<string, int> fruits{
    {"Apple", 5}, {"Grapefruit", 7}, {"Cherry", 10}, {"Grapes", 16}
};


for (const auto& p : fruits)
    cout << p.first << " " << p.second << endl;
cout << endl << endl;


auto it = fruits.begin();
++++it;

using type = std::pair<class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char> > const, int>;

auto it2 = std::lower_bound(fruits.cbegin(), fruits.cend(), type{"Cherry", 10});
//  auto it3 = std::lower_bound(fruits.cbegin(), fruits.cend(), pair<string, int>{ "Cherry", 10 });
auto it4 = std::lower_bound(fruits.cbegin(), fruits.cend(), pair<const string, int>{ "Cherry", 10 });

for (auto beg = fruits.cbegin(); beg != it2; ++beg)
    cout << beg->first << " " << beg->second << endl;

cout << typeid(*it).name() << endl;

Поэтому моя проблема заключалась в том, как передать третий параметр в std::lower_bound явно?

  • Потому что после получения справки от typeid я заметил, что пара first равна const, это потому, что ключи constants?

  • Также, что произойдет, если я передам значение для данного ключа, который не соответствует ключу в контейнере. Например: элемент с ключом "Cherry" имеет значение 10, так почему lower_bound работает правильно, если я передаю ему недействительный value с ключом типа pair{"Cherry", 345}?

  • Является ли значение пары, переданное в lower_bound, произвольным?

1 Ответ

6 голосов
/ 07 октября 2019

Не делай этого. std::map имеет свою собственную функцию-член lower_bound, поэтому вам не нужна функция сравнения, и она также более эффективна.

Итератор для map имеет first part const, потому чтоты не можешь это изменить. Используемые типы данных и алгоритмы основаны на том, что значение ключа остается неизменным на протяжении всей жизни карты.

...