libreria iterador español ejemplo c++ exception standard-library c++-faq exception-safety

c++ - iterador - ¿Dónde puedo encontrar todas las garantías de excepción para los contenedores y algoritmos estándar?



stl c++ español (3)

n3376

23.2.1 Requisitos generales del contenedor [container.requirements.general]

Párrafo 10

A menos que se especifique lo contrario (ver 23.2.4.1, 23.2.5.1, 23.3.3.4 y 23.3.6.5), todos los tipos de contenedores definidos en esta Cláusula cumplen los siguientes requisitos adicionales:
- si una excepción es lanzada por una función insert () o emplace () al insertar un solo elemento, esa función no tiene efectos.
- si una excepción es lanzada por una función push_back () o push_front (), esa función no tiene efectos.
- la función no erase (), clear (), pop_back () o pop_front () lanza una excepción.
- ningún constructor de copia u operador de asignación de un iterador devuelto lanza una excepción.
- ninguna función swap () lanza una excepción.
- ninguna función swap () invalida las referencias, los punteros o los iteradores que se refieren a los elementos de los contenedores que se intercambian.
[Nota: el iterador end () no hace referencia a ningún elemento, por lo que puede ser invalidado. —Enuncia]

23.2.4 Contenedores asociativos [associative.reqmts]

23.2.4.1 Garantías de seguridad de excepción [associative.reqmts.except]

1 Para contenedores asociativos, ninguna función clear () lanza una excepción. erase (k) no lanza una excepción a menos que esa excepción sea lanzada por el objeto Comparar del contenedor (si lo hubiera).
2 Para los contenedores asociativos, si se produce una excepción por cualquier operación desde una función de inserción o colocación que inserta un solo elemento, la inserción no tiene efecto.
3 Para los contenedores asociativos, ninguna función de intercambio lanza una excepción a menos que esa excepción sea lanzada por el intercambio del objeto de Comparación del contenedor (si corresponde).

23.2.5 Contenedores asociativos desordenados [unord.req]

23.2.5.1 Garantías de seguridad de excepción [unord.req.except]

1 Para contenedores asociativos no ordenados, ninguna función clear () lanza una excepción. erase (k) no lanza una excepción a menos que esa excepción sea lanzada por el objeto Hash o Pred del contenedor (si corresponde).
2 Para contenedores asociativos no ordenados, si se produce una excepción por cualquier otra operación que no sea la función hash del contenedor desde dentro de una función de inserción o emplace que inserta un solo elemento, la inserción no tiene efecto.
3 Para los contenedores asociativos no ordenados, ninguna función de intercambio lanza una excepción a menos que esa excepción sea lanzada por el intercambio del objeto Hash o Pred del contenedor (si corresponde).
4 Para contenedores asociativos no ordenados, si se lanza una excepción desde dentro de una función rehash () que no sea la función hash o la función de comparación del contenedor, la función rehash () no tiene efecto.

23.3.3.4 modificadores de deque [deque.modifiers]

void push_back (T && x); Párrafo 2

Observaciones: Si se produce una excepción distinta a la del constructor de copia, mover constructor, operador de asignación o mover operador de asignación de T, no hay efectos. Si el constructor de movimientos de una T que no es CopyInsertable lanza una excepción, los efectos no se especifican.

borrar iterador (primero const_iterator, const_iterator último); Párrafo 6

Tiradas: nada, a menos que el constructor de copia, el operador de asignación, el operador de asignación o el operador de asignación de movimiento lancen una excepción de T.

23.3.6.5 modificadores vectoriales [vector.modifiers]

void push_back (T && x); Párrafo 2

Si el constructor de movimientos de una T que no es CopyInsertable lanza una excepción, los efectos no se especifican.

borrar iterador (primero const_iterator, const_iterator último); Párrafo 5

Tiradas: nada, a menos que el constructor de copia, el operador de asignación, el operador de asignación o el operador de asignación de movimiento lancen una excepción de T.

Sí, he analizado los estándares de C ++ que pude encontrar (o los borradores), pero no encuentro ninguna garantía completa de las garantías de excepción que ofrecen los contenedores de STL. Todo lo que puedo encontrar son secciones ocasionales con descripciones incompletas de algunas de las funciones para algunos de los tipos. O quizás está ahí, pero simplemente no lo encuentro, no lo sé.

Nota: No estoy pidiendo una lista de todas las garantías que las personas pueden pensar, lo cual es básicamente en esta pregunta .
Estoy buscando la fuente autorizada de esta información en sí misma, o preferiblemente, una versión gratuita de la fuente (por ejemplo, un borrador de la norma) donde pueda más o menos tratar como oficial.


El documento al que se ha vinculado, el borrador del estándar n3337, puede tratarse como oficial. Es el estándar C ++ 11 más pequeños cambios editoriales.

Solo necesita aprender a leer el estándar, lo cual es comprensible porque no pretende ser una lectura fácil.

Para encontrar las garantías de excepción para cualquier operación de biblioteca en particular, verifique las especificaciones de esa operación para ver si hay comentarios y comentarios sobre excepciones. Si la función es una función miembro, verifique la especificación del tipo para obtener comentarios sobre seguridad de excepción y qué requisitos cumple. Luego, verifique los requisitos cumplidos para ver las garantías de excepción que deben realizar los objetos para cumplir esos requisitos.

Para tipos genéricos y algoritmos, también verifique los requisitos establecidos en los parámetros de la plantilla para ver qué requisitos deben cumplir esos tipos para cumplir con todas las garantías de excepción realizadas por el tipo o algoritmo o función miembro (si los parámetros de la plantilla no se cumplen). t cumple con los requisitos especificados y luego usar la plantilla con esos parámetros tiene un comportamiento indefinido y no se aplica ninguna de las especificaciones de la plantilla).


Leer el estándar puede ser aterrador (volvamos al estándar), pero Bjarne Stroustrup ha escrito un apéndice muy bueno sobre este tema en su libro ''El lenguaje de programación C ++''. Él publicó este apéndice en

http://www.stroustrup.com/3rd_safe0.html , en http://www.stroustrup.com/3rd_safe.pdf

Es bastante largo y detallado (y está bien escrito). Por ejemplo, puede encontrar interesante la sección E.4, citar:

E.4 Garantías de contenedores estándar

Si la operación de una biblioteca lanza una excepción, puede, y lo hace, asegurarse de que los objetos en los que opera permanezcan en un estado bien definido. Por ejemplo, at () tirar out_of_range para un vector (§16.3.3) no es un problema con la seguridad de excepción para el vector. El escritor de at () no tiene ningún problema en asegurarse de que un vector esté en un estado bien definido antes de lanzar.

Además, la sección E.4.1 establece

Además de la garantía básica, la biblioteca estándar ofrece la garantía sólida para algunas operaciones que insertan o eliminan elementos.

eche un vistazo a la página 956. Contiene una tabla de garantías para varias operaciones de vector, deque, lista y mapa. En resumen, todas las operaciones en esos contenedores son no fuertes o fuertes, a excepción de la inserción de elementos N en el mapa que ofrece las garantías básicas.

Nota: el texto anterior es antiguo y no aborda C ++ 11, pero debería ser lo suficientemente correcto para la mayoría de los objetivos y propósitos.

Cuando se trata de C ++ 11 ...

los primeros estados estándar, sobre la array, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack contenedores array, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack : at

23.2.1 / 10 :

A menos que se especifique lo contrario (ver 23.2.4.1, 23.2.5.1, 23.3.3.4 y 23.3.6.5), todos los tipos de contenedores definidos en esta Cláusula cumplen los siguientes requisitos adicionales:

- si una excepción es lanzada por una función insert () o emplace () al insertar un solo elemento, esa función no tiene efectos.
- si una excepción es lanzada por una función push_back () o push_front (), esa función no tiene efectos.
- la función no erase (), clear (), pop_back () o pop_front () lanza una excepción.
- ningún constructor de copia u operador de asignación de un iterador devuelto lanza una excepción.
- ninguna función swap () lanza una excepción.
- ninguna función swap () invalida las referencias, los punteros o los iteradores que se refieren a los elementos de los contenedores que se intercambian.

Las peculiaridades señaladas en las secciones respectivas mencionadas anteriormente (cada una llamada garantías de seguridad Exception) se refieren principalmente a casos especiales contra la pared, como cuando se trata de excepciones del hashing de los tipos contenidos, las operaciones de comparación, el intercambio de movimientos y el movimiento de lanzamiento. operaciones