Есть ли способ найти обратный итератор для первого элемента в std :: map меньше заданного ключа? - PullRequest
1 голос
/ 29 февраля 2012

Я наткнулся на следующий фрагмент кода на 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 ().

1 Ответ

3 голосов
/ 29 февраля 2012

На основании комментария 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.
...