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

特に、最後の使用やと--itrの比較は好きではありません。どちらも私には違和感を覚えます。itrbegin()

valueSTLを使用して、見つからない場合はend()(またはrend())を返すようなルックアップを実行し、そうでない場合はコード以下の最後の要素を返す方法があるかどうか疑問に思っています。このようになります:

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

valueある意味で、またはが見つからない場合はrend()以下の最後の要素に逆イテレータを返すreverse_lower_bound()が必要です。

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 に答える