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?
-
14-11-2019 - |
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é().
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.