2012-03-19 12 views
6

¿Hay algún contenedor "estándar" (STL, boost) que pueda presentar múltiples fragmentos de memoria como uno continuo? Necesito trabajar con algunos datos con los siguientes condiciones:Contenedor para presentar múltiples fragmentos de memoria como uno continuo continuo

  • tamaño total de datos no se conoce de antemano (de respuesta web)
  • memoria se asigna en trozos (con alguna función de asignación externa, que no tengo ningún control de)
  • liberación de memoria no está controlada por mí, por lo que las reasignaciones son relativamente caros

así, después de obtener todos los datos, tengo una lista de trozos de memoria. Y necesito aplicar algunos algoritmos STL (búsqueda, copia, etc.) a los datos como un todo. Hay una solución para escribir contenedor para contener información sobre estos fragmentos + iterador directo que es capaz de "saltar" de un fragmento a otro.

Pero el problema parece bastante general, así que espero que haya alguna respuesta conocida que me falta. Gracias por adelantado.

Respuesta

4

La memoria se le proporciona a usted, usted dice. Eso suena como que no quieres copiarlo. No hay problema, la filosofía de STL es bastante flexible. Realmente no necesitas un contenedor; solo están allí para la administración de la memoria y eso ya está solucionado.

Lo que do necesita es un iterador. No hay uno estándar; tendrás que escribir uno tú mismo. Hay demasiadas pequeñas variaciones para proporcionar una solución estándar para esto. Pero no te preocupes, es bastante fácil. Obtiene los typedefs necesarios si hereda de std::iterator<value_type>, por lo que solo necesita escribir operator* (sencillo) y operator++/operator--/operator+/operator- (que comprenden los trozos).

+0

Estoy totalmente de acuerdo en que necesito un iterador y lo he mencionado como una posible solución. Pero usar un iterador sin contenedor me parece extraño. Debido a que debería obtener mi 'begin()' y 'end()' de alguna manera, encapsular esto en el contenedor parece natural. Tal vez la palabra _container_ es mal utilizada aquí por mí.No estoy hablando del concepto de contenedores STL, sino de algún "titular" para trozos separados que los encapsularían. Solo tenía esperanza de que no debería implementar esto yo mismo. De todos modos, gracias por una respuesta. –

+0

"_Container_" está bien definido en C++ (es el capítulo 23 de la norma). – MSalters

0

Así, después de obtener todos los datos, tengo una lista de trozos de memoria. Y necesito aplicar algunos algoritmos STL (búsqueda, copia, etc.) a los datos como un todo. Hay una solución para escribir contenedor para contener información sobre estos fragmentos + iterador directo que es capaz de "saltar" de un fragmento a otro.

Parece que necesita un iterador que atraviese todos sus fragmentos sin problemas. std::deque<> proporciona un iterador similar porque también asigna memoria en fragmentos.

A menos que realmente lo necesite en un bloque contiguo de memoria. En este caso, todos los fragmentos deberían copiarse en una pieza continua de memoria.

Cuestiones relacionadas