1

我在 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;
}

特别是,我不喜欢最后的使用,也不喜欢to--itr的比较,它们都让我觉得不对劲。itrbegin()

我想知道 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()。

4

1 回答 1

3

根据 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.
于 2012-02-29T17:21:57.923 回答