11
votes

Fonction STL pour tester si une valeur est dans une certaine plage?

J'ai une fonction: BOOL INTBOUDS (Valeur int, Int Low, Int High) . Y a-t-il un équivalent stl qui fait des choses utiles (prend des variables de types différents, en particulier)? Je ne trouve pas d'utiliser Google et je préférerais réutiliser plutôt que de réécrire.


1 commentaires

Puis-je suggérer dans comme nom plus simple?


4 Réponses :


17
votes

en C ++ 17, il n'y a pas d'équivalent direct d'une fonction comme celle-ci, mais pour des types plus petits avec des comparaisons d'égalité rapide, vous pouvez utiliser std :: pince code> : xxx pré>

Vous pouvez simplement écrire votre propre fonction pour tester cette opération. : P>

template <typename T, typename R, typename Comparator>
    bool IsInBounds(const T& value, const R& low, const R& high, Comparator comp) {
    return !comp(value, low) && comp(value, high);
}


6 commentaires

Merci. Je suis toujours provisoire avec des modèles - les exemples sont très appréciés.


Est la limite supérieure inférieure / exclusive inclusive intentionnelle?


@ Tzaman- Je viens de supposer que c'est ce qui était destiné. Je posterai une mise à jour si différentes limites sont souhaitées.


@Tzaman Inclusive inférieure et exclusive est ce que j'utilise pour le moment.


N'est-ce pas STD :: PLAMP A C ++ 17 fonction? EN.CPPREFERFERATION.COM/W/CPP/ALGORITHM/CLAMP


Je me suis trompé! Laisse-moi réparer ça ...



-2
votes

Je pense presque que vous feriez mieux que vous feriez mieux de ne pas essayer une telle tâche apparemment triviale avec une fonction entière et juste en ligne le comportement.

quelque chose comme ceci: P>

  1 #include <iostream>
  2 
  3 int main() {
  4     int value = 5;
  5     bool inside = false;
  6     int lower = 0;
  7     int upper = 10;
  8     inside = lower < value && value < upper;
  9     printf("inside: %d", inside);
 10     return 0;
 11 }


4 commentaires

Vous devez corriger la ligne 8: inférieur ne fonctionne pas correctement en C ++. Vous devriez le diviser en inférieur . Je suis également en désaccord que cela devrait être inlincé. C'est un beau sous-programme propre et avec des compilateurs comme ils sont maintenant, il sera presque certainement inliné.


Ce n'est pas une question de performance dans mon cas, j'ai juste eu du mal à justifier en résumant cela avec les informations actuellement disponibles.


Je l'utilise actuellement sur les valeurs de vérification des limites 4, qui sortent un énoncé assez important si - il est beaucoup plus facile de lire si j'enveloppe le test dans une fonction, et il y a moins de chance de moi échec typographiquement.


Cela me semble raisonnable, l'autre réponse à propos de STL devrait bien vous servir alors. Si ce n'est pas le cas, décrivez ce dont vous avez besoin.



5
votes
if (interval(a, b).contains(value))
    // ...

0 commentaires

1
votes

Vous pouvez composer un de std :: moins , std :: plus , std :: lid et std :: Composez , mais c'est vraiment trop exclu.

Lambda est beaucoup plus facile:

[] (valeur int, int faible, int hauteur) {return! (valeur

ou, si bas et élevé sont dans la portée

[faible, élevé] (valeur int) {return! (valeur


0 commentaires