Есть ли способ найти обратный итератор для первого элемента в std::map меньше заданного ключа?
-
14-11-2019 - |
Вопрос
Я наткнулся на следующий фрагмент кода на C++ (я еще не на C++11):
int test(std::map<int, size_t> &threshold, const int value) {
std::map<int, size_t>::const_iterator itr = threshold.upper_bound(value);
if (threshold.begin() == itr) {
return -1;
}
return return (--itr)->second;
}
В частности, мне не нравится использование --itr
в конце ни сравнение itr
к begin()
, они оба кажутся мне неправильными.
Мне интересно, есть ли способ с помощью STL выполнить какой-либо поиск, который возвращал бы end() (или rend()), если не найден, и в противном случае возвращал бы последний элемент, который меньше или равен value
таким образом, код больше походил бы на этот:
int test(std::map<int, size_t> &threshold, const int value) {
std::map<int, size_t>::const_reverse_iterator itr = threshold.WhatGoesHere(value);
if (threshold.rend() == itr) {
return -1;
}
return return itr->second;
}
В некотором смысле, я хочу reverse_lower_bound(), который возвращает обратный итератор к последнему элементу, который не больше, чем value
или, если ничего не удается найти, rend().
Решение
Основываясь на комментарии Xeo, я думаю, что это и есть ответ:
int test(std::map<int, size_t> &threshold, const int value) {
std::map<int, size_t>::const_reverse_iterator
last_element_not_greater_than(threshold.upper_bound(value));
if (threshold.rend() == last_element_not_greater_than) {
return -1;
}
return return last_element_not_greater_than->second;
}
Я научился этой новой вещи:
When an iterator is reversed, the reversed version does not point to the same
element in the range, but to the one preceding it.