2017-09-10 3 views
1

Wondeirng pourquoi le code ci-dessous renvoie 1? Je n'insère jamais 1 dans le conteneur multiset.sortie inattendue de C++ multiset lower_bound

#include <iostream> 
#include <set> 

int main() 
{ 
    std::multiset<int> mymultiset; 
    std::multiset<int>::iterator itlow; 

    mymultiset.insert(-3); 
    itlow = mymultiset.lower_bound (3); 
    std::cout << *itlow << endl; // output 1 

    return 0; 
} 
+2

vérifier pour end() - lower_bound Valeur de retour: Itérateur pointant sur le premier élément qui n'est pas inférieur à la valeur, ou dernier si aucun élément de ce type n'est trouvé. –

+0

@ArtemyVysotsky, comprendre vérifier pour la fin, mais pourquoi 1 est retourné? D'où vient-il? –

Répondre

4

mymultiset.lower_bound(3) retourne le plus bas emplacement dans le conteneur où 3 pourrait aller, et c'est à la fin du récipient. Donc itlow est égal à mymultiset.end(), et il n'est pas déréférenceable. std::cout << *itlow a un comportement indéfini.

+0

Merci Pete, je pense que 1 est retourné car c'est un comportement indéfini. Marquez votre réponse comme réponse. –

1

Vous essayez d'obtenir un Iterator dont la borne inférieure est 3, et votre valeur maximale est -3. Vous avez donc un itérateur de fin, dont la valeur n'est pas définie. Vous devriez utiliser multiset::begin() comme votre Iterator, ou mettre quelque chose comme itlow = mymultiset.lower_bound (-4); qui n'est pas très doux.