Si tenemos map <int, vector<int> >
se mueven cuando el árbol rojo-negro del mapa cambia o almacena punteros a vector
so algo así y no los mueve (de lo contrario, trabajar con mapas no será O (lg n) por ejemplo, si ya nos push_back elementos a algunos vector
s)¿Es estable la segunda parte del mapa <..,..>?
Respuesta
Ver esta: std::map, pointer to map key value, is this possible?
la segundo respuesta más común:
Sección 23.1.2 # 8 (con asociativa requisitos de tainer):
"Los miembros de inserción no afectarán la validez de los iteradores y las referencias al contenedor, y los miembros de borrado invalidarán únicamente los iteradores y las referencias a los elementos borrados".
Así sí punteros almacenamiento a los miembros de datos de un elemento del mapa está garantizada para ser válido, a menos que quite que elemento.
Por lo tanto, si se conservan las referencias, los datos no se pueden copiar en una parte diferente de la memoria. Y si ese es el caso, no veo el punto de realizar ninguna copia ...
No, los vectores no se moverán. Las manipulaciones del árbol simplemente reorganizan punteros entre los nodos. No mueven los nodos o sus contenidos en la memoria.
Creo que el C++ 03 no ofrece ninguna garantía de estabilidad de los datos en la memoria, y esto sería un detalle de implementación (y en realidad no es algo que pueda asumir sin pruebas).
Tenga en cuenta que la preservación de los iteradores al mapa y la ubicación del vector real en la memoria son cosas completamente diferentes. La validez de los iteradores está claramente definida (tanto cuando son válidos como cuando no lo son) en la especificación C++, pero el comportamiento interno real del árbol no lo está.
Dicho esto, cualquier compilador decente (para compilaciones de versión/con optimizaciones habilitadas) optimizaría la implementación para no copiar realmente el vector cuando se mueve en el árbol, y las implementaciones de C++ 11 de std::map
usarían semántica de movimiento para garantizar ese comportamiento.
Lo que no puede asumir es que internamente solo se mueven los punteros.
'std :: map
Pero también conserva las referencias (indicadores simples), no solo los iteradores. Esto te permite discutir sobre la memoria. A menos que haya alguna extraña virtualización de direcciones de memoria ... – CygnusX1
- 1. inicializar mapa <cadena, vector <string>>
- 2. La omisión de la segunda parte del operador ternario
- 3. Poner en un mapa <String, ?>
- 4. ¿Cuál es la diferencia entre <% %> y <%=%>?
- 5. ¿Cuál es la diferencia entre <%# %> y <%= %>?
- 6. Cuál es la diferencia entre Task <> y IAsyncOperation <>
- 7. Usar la etiqueta <form:select> con un mapa
- 8. Refactorando Func <T> en la Expresión <Func<T>>
- 9. ¿Es unordered_set <reference_wrapper <Ty>> válido?
- 10. ¿Qué es <span></span> elemento?
- 11. La comprensión HashMap <K,V>
- 12. Android:</p> <pre><code>com.myapp.SomeActivity </code></pre> <p>Para cada declaración de registro que Anteponer la primera parte: Filtro Logcat por etiqueta usando una expresión regular
- 13. ¿Cuál es la diferencia entre el conjunto <pair> y el mapa en C++?
- 14. Depuración visual utilizando >>,>,> |, ||, | <, <, <<
- 15. ¿Es incorrecto colocar la etiqueta <script> después de la etiqueta</body>?
- 16. ¿Qué tan estable es WPF?
- 17. ¿Es <form> válido sobre <tr>?
- 18. ¿Qué idioma es eso? (<%REPEAT...%>, <opcional% ...%>)
- 19. JavaScript no intrusivo: <script> en la parte superior o inferior del código HTML?
- 20. ¿Cuál es la etiqueta <dl>?
- 21. ¿Qué es la Acción <string>?
- 22. ¿La etiqueta <tr> es opcional?
- 23. Uso STL para poblar un vector <T> del mapa <T,Z> 's claves
- 24. mapa de incremento <string, int> usando el operador ++
- 25. Java: ¿Cuál es la diferencia entre <init> y <clinit>?
- 26. incluyendo <xstring>, <cstring>, <string> y <wstring> en C++
- 27. cómo iterar una lista como Lista <Mapa <Cadena, Objeto >>
- 28. ¿Cuál es el punto del atributo <option> "etiqueta" dentro de <select>?
- 29. ¿Cuál es la diferencia entre <C-C> y <C-[> en vim?
- 30. ¿Por qué es Func <T> ambiguo con Func <IEnumerable <T>>?
Esto no aborda la pregunta principal: ¿'std :: map' está permitido para _move_ elements? –
Si un elemento se movió, un puntero/referencia a él se invalidaría (estoy hablando de punteros simples, no iteradores). Es por eso que no, no está permitido mover elementos. ... bueno, en teoría, alguna implementación podría copiar el objeto en algún lugar y luego regresar a la posición anterior, pero eso sería algo extraño. – CygnusX1
Aunque, curiosamente, no se hace tal requisito de 'borrar '. –