usar - clase stl c++
Punteros a elementos de contenedores STL (4)
Dado un contenedor STL (también puede tener en cuenta boost::multi_index_container
y boost::multi_index_container
) que no es contiguo, se garantiza que las direcciones de memoria de los elementos dentro del contenedor nunca cambian si no se elimina ningún elemento, (pero se pueden agregar nuevos)?
p.ej
class ABC { };
//
//...
//
std::list<ABC> abclist;
ABC abc;
abclist.insert(abc);
ABC * abc_ptr = &(*abclist.begin());
En otras palabras, abc_ptr
será apuntado a abc
durante la ejecución, si no abc_list
abc
de abc_list
.
Estoy preguntando esto porque voy a envolver la clase ABC
en C ++ / Cli, así que necesito punteros a las instancias ABC
en la clase contenedora. ABC es una clase simple y quiero que el contenedor maneje la memoria. Si la respuesta es no, std::list<ABC*>
.
Como Armen mencionó std :: list, std :: set, y std :: map se garantiza que solo invalidará el iterador eliminado. En el caso de boost :: unodered_map, los modificadores pueden invalidar los iteradores.
http://www.boost.org/doc/libs/1_38_0/doc/html/boost/unordered_map.html
Creo que es mejor usar std::list <shared_ptr <ABC> >
lugar de pasar un puntero. Es una buena práctica delegar la administración de la memoria (consulte scott meyers eficaz c ++)
Esto tiene múltiples ventajas:
- Puedes compartirlos y pasarlos sin el dolor de cabeza de liberarlos.
- recolección de basura de sus punteros
- no pasas un puntero en primer lugar
El estándar de C ++ coloca reglas estrictas sobre la validez de las referencias / iteradores. Para cada contenedor, cada método documenta qué elementos se pueden mover (invalidando referencias e iteradores).
Los contenedores basados en nodos: list
, map
, set
, multimap
y multiset
garantizan que las referencias y los iteradores a los elementos seguirán siendo válidos siempre que el elemento no se elimine del contenedor.
Su caso de uso es, por lo tanto, uno de los casos en los que usar una list
para el almacenamiento es bueno, ya que la invalidación garantiza la oferta de la lista.
std::list
, std::set
y std::map
garantizan que los iteradores (incluidos los punteros simples) no se invalidarán cuando se agregue o incluso se elimine un nuevo elemento.