web-dev-qa-db-fra.com

Stocker les résultats de la méthode std :: stack .pop () dans une variable

J'aimerais faire ce qui suit:

std::stack <int> s;
int h = 0;
s.Push(2);
h = s.pop();

De manière à ce que h contienne la valeur 2. Lorsque j'essaie de ma méthode, j'obtiens “la valeur vide n'est pas ignorée comme il se doit”.

N'est-ce pas l'intention de la méthode .pop()? Quelle est la manière préférée de faire cela?

20

Les conteneurs de bibliothèque standard séparent top() et pop(): top() renvoie une référence à l'élément supérieur et pop() supprime l'élément supérieur. (Et de même pour back()/pop_back() etc.).

Il y a une bonne raison pour cette séparation et ne pas avoir pop supprimer l'élément supérieur et le renvoyer: l'un des principes directeurs de C++ est que vous ne payez pas pour ce dont vous n'avez pas besoin. Une seule fonction n'aurait d'autre choix que de renvoyer l'élément par valeur, ce qui peut être indésirable. La séparation des préoccupations donne à l'utilisateur le plus de flexibilité dans l'utilisation de la structure de données. (Voir la remarque n ° 3 dans la documentation originale de la STL .)

(En tant que curiosité, vous remarquerez peut-être que pour un conteneur concurrent , une fonction semblable à pop- est en fait-force pour supprimer et renvoyer la valeur supérieure de manière atomique, car dans un contexte concurrent, Il n’existe pas de notion "être au top" (ou "être vide". C’est l’un des exemples évidents de la façon dont les structures de données simultanées subissent un impact significatif sur les performances afin de fournir leurs garanties.)

34
Kerrek SB

Vous pouvez utiliser:

h = s.top();

puis après cette utilisation (si vous voulez supprimer la valeur la plus récente, sinon ne faites rien)

 s.pop();

Cela fonctionne de la même manière !!

2
Marco167

Vous pouvez réellement utiliser s.top() pour stocker l’élément, puis l’afficher à l’aide de 

s.pop().

utilisation 

int h=s.top();
s.pop()

au lieu de 

int h=s.pop()

Vous ne pouvez pas affecter directement s.pop() à un type de données car s.pop() supprime l'élément de la pile et ne renvoie rien.

0
user10059288