Cómo escribir operaciones genéricas en contenedores C++ STL? Por ejemplo, Java tiene una interfaz Collection, que implementa todos los contenedores Java (excepto los mapas). Puedo hacer operaciones como agregar, eliminar, contener e iteraciones, independientemente de si el contenedor real es LinkedList, HashSet, ArrayBlockingQueue, etc. Lo encuentro muy poderoso. C++ tiene iteradores, pero ¿qué ocurre con operaciones como agregar y eliminar? vector tiene push_back, set tiene insert, cola tiene push. ¿Cómo agregar algo al contenedor C++ de una manera genérica?Operaciones genéricas en contenedores C++
Respuesta
Mire el encabezado <algorithm>
. Hay muchos algoritmos genéricos para encontrar, clasificar, contar, copiar, etc. que funcionan en cualquier cosa que proporcione iteradores con varias características específicas.
C++ tiene std::inserter
y amigos para agregar elementos a un contenedor de forma genérica. Están en el archivo de encabezado iterator
.
de iteración:
Todos los contenedores estándar tienen iterators
que dan ordenó el acceso a los elementos de los contenedores. Estos también se pueden usar en algoritmos genéricos que funcionan en cualquier tipo de iterador conforme.
Inserción:
Todas las secuencias y contenedores asociativos pueden tener elementos insertados en ellos por la expresión c.insert(i, x)
- donde c
es una secuencia o contenedor asociativo, i
es un iterador en c
y x
es un valor que Desea agregar al c
.
std::inserter
y sus amigos se pueden utilizar para agregar elementos a una secuencia o contenedor asociativo de forma genérica.
Remoción:
para cualquier secuencia o contenedor asociativo el código siguientes obras:
while (true) {
X::iterator it(std::find(c.begin(), c.end(), elem));
if (it == c.end()) break;
c.erase(it);
}
Dónde X
es el tipo de recipiente, c
es un objeto contenedor y elem
es un objeto con el valor que desea eliminar del contenedor.
Para las secuencias no es el idioma de borrado de quitar, que se parece:
c.erase(std::remove(c.begin(), c.end(), elem), c.end());
Para contenedores asociativos también se puede hacer:
c.erase(k);
Dónde k
es una clave que corresponde al elemento que quieres borrar
Una interfaz agradable a todo esto:
Ver Boost.Range.
Nota: - estos son tiempos de compilación sustituibles, mientras que los de Java se pueden sustituir por tiempo de ejecución. Para permitir la sustitución en tiempo de ejecución, es necesario utilizar el borrado de tipo (es decir, crear una subclase de plantilla que reenvía la interfaz requerida al contenedor con el que se crea la instancia).
borrar-eliminar solo funciona en _sequences_, no todos los contenedores estándar. –
@Charles Bailey - ¡Gracias por el consejo! Respuesta actualizada – Mankarse
Pero ha escrito "contenedor asociativo" que eran precisamente los contenedores en los que estaba pensando que no puede usar borrar-eliminar. –
- 1. C# Múltiples restricciones genéricas
- 2. operaciones atómicas en C++
- 3. operaciones "pseudoatómicas" en C++
- 4. C# vs Java - Listas genéricas
- 5. comportamiento de los contenedores C++
- 6. ¿Qué son las colecciones genéricas en C#?
- 7. ¿Cómo emitir listas genéricas dinámicamente en C#?
- 8. C# Métodos de llamada en clases genéricas
- 9. ¿Por qué usar restricciones genéricas en C#
- 10. Interfaz/Superclase para Colecciones/Contenedores en C++
- 11. Depuración de contenedores C++ STL en Windbg
- 12. ¿Hay contenedores concurrentes en C++ 11?
- 13. C operaciones # lista multiproceso
- 14. Interfaces genéricas y no genéricas
- 15. Operaciones atómicas en C en Linux
- 16. Contando operaciones de cambio C#
- 17. ¿Cómo puedo contar operaciones en C++?
- 18. operaciones atómicas para shared_ptr en C++ 11
- 19. ¿Los contenedores estándares C++ 11 son "definitivos"?
- 20. Operaciones previas múltiples en una variable en C++ (¿C?)
- 21. VB.NET Dos enfoques diferentes para las operaciones genéricas de subprocesos cruzados; ¿cual es mejor?
- 22. Asignación entre los contenedores stl C++ y C#
- 23. ¿Cómo combinar más de dos listas genéricas en C# Zip?
- 24. Captura de excepciones específicas frente a genéricas en C#
- 25. ¿Cómo devolver una colección de listas genéricas en C#?
- 26. interfaces genéricas
- 27. ¿Cómo uso contenedores C++ STL en la aplicación My iPhone?
- 28. ¿Puedo tener contenedores polimórficos con semántica de valores en C++?
- 29. Restricciones genéricas en la función
- 30. Inicializando variables genéricas en Scala
verifique la sección 25 del Estándar C++, que contiene 28 páginas de varios algoritmos, que funcionan en varios contenedores. –