有没有办法为std :: map中的第一个元素找到一个反向迭代器,而不是给定的键?

时间:2012-02-29 17:08:14

标签: c++ stl iterator stdmap lower-bound

我在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,也不喜欢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()。

1 个答案:

答案 0 :(得分: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.