2010-09-08 9 views
3

Si j'utilise reserve() pour réserver suffisamment d'éléments pour un vecteur, push_back() (ou insert()) lancera-t-il des exceptions?stl et exceptions

Y at-il une référence quelque part qui spécifie quelle fonction stl lancer/ne pas jeter des exceptions?

Merci.

+0

Avez-vous essayé de google 'référence C++'!? Étonnamment, le premier résultat est exactement ce que vous cherchez. – log0

+0

Je ne suis pas sûr que cette référence contienne toutes les informations dont j'ai besoin, car je ne trouve aucun endroit où il est garanti qu'une fonction ne soit pas lancée. Dans ce cas, dois-je supposer que cela signifie que la fonction ne jette vraiment pas, ou que la référence omet simplement cette information? – user418680

Répondre

5

Si j'utilise reserve() pour réserver suffisamment d'éléments pour un vecteur, push_back() (ou insert()) lancera-t-il des exceptions?

Il ne sera pas nécessaire d'effectuer une réaffectation, et donc le vecteur lui-même ne lancera aucune exception. Toutefois, les éléments que vous insérez peuvent renvoyer des exceptions lorsqu'ils sont copiés dans le vecteur. Par conséquent, push_back et insert peuvent toujours générer des exceptions.

Y at-il une référence quelque part qui spécifie quelle fonction stl lancer/ne pas jeter des exceptions?

Oui, le standard C++ contient cette information.

+0

Oui, je l'ai trouvé, merci. – user418680

4

Je dirais que push_back se déclenche lorsque la construction de copie se déclenche.

Maintenant, une exception mise en œuvre sûre de std::vector maintiendra l'état de vector tel qu'il était avant que vous avez appelé push_back ou insert afin que vous puissiez continuer à utiliser l'objet.

Aussi, jetez un oeil à Lessons Learned from Specifying Exception-Safety for the C++ Standard Library par David Abrahams.

+1

Un 'vecteur' ne peut pas réellement implémenter la garantie d'exception forte. Il ne peut pas revenir à l'état précédent car les éléments de copie peuvent être lancés et un vecteur les stocke par valeur. 'vector' ne fournit que la garantie de base (le vecteur sera laissé dans un état valide, et aucune ressource ne sera divulguée) – jalf

+0

merci pour le commentaire jalf –

+0

@jalf: Etes-vous sûr? Je ne me souviens pas de cette latitude. Si vous ajoutez un 6ème élément à un vecteur et qu'il doit être réaffecté, alors le 4ème exemplaire de ctor peut échouer. Mais à ce stade, le tableau original de 5 éléments existe toujours. Le rollback n'est probablement même pas nécessaire: vous échangez uniquement des pointeurs une fois toutes les copies réussies. – MSalters

0

Je ne peux répondre qu'à la première des deux questions.

La méthode reserve(K) alloue suffisamment d'espace sur le vector pour accueillir K éléments sans faire une réaffectation coûteuse, mais le vector peut croître en taille si un nombre suffisant d'insertions sont faites.