Antes de escribir la mía, les preguntaré a todos ustedes.Buscando clase vector C++ STL-like pero usando almacenamiento de pila
Estoy buscando una clase de C++ que sea casi exactamente como un vector STL pero almacena datos en una matriz en la pila. Algún tipo de clase de asignador STL también funcionaría, pero estoy tratando de evitar cualquier tipo de pila, incluso acumulaciones estáticas por subproceso (aunque una de esas es mi segunda opción). La pila es simplemente más eficiente.
Tiene que ser casi una gota en reemplazo del código actual que usa un vector.
Por lo que iba a escribir, yo estaba pensando en algo como esto:
char buffer[4096];
stack_vector<match_item> matches(buffer, sizeof(buffer));
O la clase podría tener espacio de búfer asignado internamente. A continuación, se vería como:
stack_vector<match_item, 256> matches;
Yo estaba pensando que sería tirar std :: bad_alloc si se queda sin espacio, aunque eso no debería ocurrir nunca.
actualización
Usando stack_container.h de cromo funciona muy bien!
La razón por la que no había pensado hacerlo de esta manera es porque siempre he pasado por alto el parámetro del objeto de asignación para los constructores de la colección STL. He usado el parámetro de la plantilla varias veces para hacer pools estáticos, pero nunca había visto código ni escrito ninguno que realmente utilizara el parámetro del objeto. Aprendí algo nuevo. ¡Muy genial!
El código es un poco complicado y, por alguna razón, GCC me obligó a declarar el asignador como un elemento real en lugar de construirlo en el parámetro del asignador del vector. Se pasó de algo como esto:
typedef std::pair< const char *, const char * > comp_list_item;
typedef std::vector<comp_list_item> comp_list_type;
comp_list_type match_list;
match_list.reserve(32);
A esto:
static const size_t comp_list_alloc_size = 128;
typedef std::pair< const char *, const char * > comp_list_item;
typedef StackAllocator< comp_list_item, comp_list_alloc_size > comp_list_alloc_type;
typedef std::vector< comp_list_item, comp_list_alloc_type > comp_list_type;
comp_list_alloc_type::Source match_list_buffer;
comp_list_alloc_type match_list_alloc(&match_list_buffer);
comp_list_type match_list(match_list_alloc);
match_list.reserve(comp_list_alloc_size);
Y tengo que repetir que cada vez que declaro una nueva. Pero funciona como yo quería.
Me di cuenta de que stack_container.h tiene un StackVector definido e intenté usarlo. Pero no hereda de vector o define los mismos métodos, por lo que no fue un reemplazo inmediato. No quería volver a escribir todo el código usando el vector, así que renuncié a él.
Para aclarar, ¿quieres algo que sea esencialmente un vector, pero con una capacidad fija como parte de los argumentos de la plantilla? –
Idea interesante ... –
StackVector tiene un método para darle el std :: vector real. solo haga StackVector :: ContainerType & v = stack_vector.container(); para conseguirlo. v entonces es un std :: vector real. También mejor uso el truco sindical que expliqué en el comentario de mi respuesta. –