Est-il un moyen de trouver un itérateur inverse, pour le premier élément dans une std::map moins d'une clé donnée?

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

Question

Je suis tombé sur l'extrait de code suivant en C++ (je ne suis pas encore sur le 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;
}

En particulier, je n'aime pas l'utilisation de --itr à la fin ni à la comparaison de itr pour begin(), ils se sentent mal pour moi.

Je me demandais si il existe un moyen avec STL pour faire une sorte de recherche qui seraient de retour fin() (ou rend()) si elle ne trouve pas et sinon pour revenir au dernier élément qui est inférieure ou égale à la value donc, le code devrait ressembler à ceci:

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

Dans un sens, je veux un reverse_lower_bound() qui renvoie un itérateur inverse, le dernier élément qui n'est pas plus grand que la value ou si aucune ne peut être trouvé de rené().

Était-ce utile?

La solution

Basé sur le commentaire de Xeo, je pense que c'est la réponse:

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

J'ai appris cette nouvelle chose:

When an iterator is reversed, the reversed version does not point to the same
element in the range, but to the one preceding it.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top