¿Existen pautas sobre cómo se debe escribir un contenedor nuevo que se comporte como cualquier STL
contenedor?
c++
stl
c++-standard-library
Avinash
fuente
fuente
Respuestas:
Esto es una secuencia pseudo-contenedor que armado a partir § 23.2.1 \ 4 Tenga en cuenta que el
iterator_category
debería ser uno destd::input_iterator_tag
,std::output_iterator_tag
,std::forward_iterator_tag
,std::bidirectional_iterator_tag
,std::random_access_iterator_tag
. También tenga en cuenta que lo siguiente es técnicamente más estricto de lo requerido, pero esta es la idea. Tenga en cuenta que la gran mayoría de las funciones "estándar" son técnicamente opcionales, debido a la genialidad de los iteradores.Además, cada vez que hago un contenedor, pruebo con una clase más o menos como esta:
Haga contenedores de
tester
objetos y llame a cada unofunction()
mientras prueba su contenedor. No hagas ningúntester
objeto global . Si su contenedor hace trampa en algún lugar, estatester
clase lo haráassert
y usted sabrá que hizo trampa accidentalmente en algún lugar.fuente
assert(tester::livecount == 0);
. Mmmmm, todavía no estoy seguro de cómo funciona este marco de prueba. ¿Podría darnos un ejemplo?memcpy
ocurrido . (la prueba no es infalible, pero detecta algunos). Ellivecount
es un detector de fugas simple, para asegurarse de que su contenedor llame a un número igual de constructores y destructores.verifier
novarifier
.std::iterator
encabezado<iterator>
Deberá leer la sección del estándar C ++ sobre contenedores y los requisitos que impone el estándar C ++ para las implementaciones de contenedores.
El capítulo relevante en el estándar C ++ 03 es:
Sección 23.1 Requisitos del contenedor
El capítulo relevante en el estándar C ++ 11 es:
Sección 23.2 Requisitos del contenedor
El borrador casi final del estándar C ++ 11 está disponible gratuitamente aquí .
También puede leer algunos libros excelentes que lo ayudarán a comprender los requisitos desde la perspectiva del usuario del contenedor. Dos libros excelentes que me llamaron la atención con facilidad son:
STL eficaz deScott Meyers y
la biblioteca estándar de C ++: un tutorial y una referencia deNicolai Josutils
fuente
Aquí hay una implementación muy simplista de un vector falso, que es básicamente un envoltorio
std::vector
y tiene su propio (pero real) iterador, que imita el iterador STL. Nuevamente, el iterador es muy simplista, omitiendo muchos conceptos comoconst_iterator
, verificaciones de validez, etc.El código se puede ejecutar desde el primer momento.
fuente