Gibt es eine Möglichkeit, einen umgekehrten Iterator für das erste Element in einer std::map zu finden, die kleiner als ein bestimmter Schlüssel ist?

StackOverflow https://stackoverflow.com/questions/9503489

Frage

Ich bin in C++ auf den folgenden Codeausschnitt gestoßen (ich bin noch nicht in 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;
}

Insbesondere gefällt mir die Verwendung von nicht --itr am Ende noch der Vergleich von itr Zu begin(), für mich fühlen sich beide falsch an.

Ich frage mich, ob es mit STL eine Möglichkeit gibt, eine Art Suche durchzuführen, die end() (oder rend()) zurückgibt, wenn sie nicht gefunden wird, und andernfalls das letzte Element zurückgibt, das kleiner oder gleich ist value der Code würde also eher so aussehen:

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

In gewissem Sinne möchte ich ein reverse_lower_bound(), das einen umgekehrten Iterator zum letzten Element zurückgibt, das nicht größer als das ist value oder wenn keines gefunden werden kann, rend().

War es hilfreich?

Lösung

Basierend auf Xeos Kommentar denke ich, dass dies die Antwort ist:

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

Ich habe etwas Neues gelernt:

When an iterator is reversed, the reversed version does not point to the same
element in the range, but to the one preceding it.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top