2011-06-07 30 views
12

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++

+3

verifique la sección 25 del Estándar C++, que contiene 28 páginas de varios algoritmos, que funcionan en varios contenedores. –

Respuesta

9

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.

8

C++ tiene std::inserter y amigos para agregar elementos a un contenedor de forma genérica. Están en el archivo de encabezado iterator.

21

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).

+0

borrar-eliminar solo funciona en _sequences_, no todos los contenedores estándar. –

+0

@Charles Bailey - ¡Gracias por el consejo! Respuesta actualizada – Mankarse

+3

Pero ha escrito "contenedor asociativo" que eran precisamente los contenedores en los que estaba pensando que no puede usar borrar-eliminar. –

Cuestiones relacionadas