2011-06-08 8 views
14

Duplicar posibles:
A std::map that keep track of the order of insertion?de contenedores STL que preserva el orden de inserción, pero no permite duplicados

Busco a un contenedor STL que preserva el orden de inserción (sin clasificación), pero hace no permitir duplicados. ¿Hay alguno? si no hay trucos que pueda usar para personalizar uno?

+0

¿Este contenedor solo admitirá elementos nuevos o necesita permitir que los elementos también se eliminen? – sep

+0

Cuando dice que conserva el orden de inserción, es probable que desee iterar sobre él. ¿Quieres iterar de principio a fin o al revés? – sep

+0

Insertaré una vez (sin eliminar) y leeré (iterar sobre elementos) muchas veces – krisostofa

Respuesta

8

No existe un contenedor de este tipo en este momento, pero puede crear uno propio de forma económica al tener juntos un std::vector y un std::set.

+1

Si sus objetos son grandes, considere almacenar punteros dentro de los contenedores y proporcione su propia función de clasificación al conjunto ctr. –

+1

Buena sugerencia. Si los objetos son lo suficientemente grandes como para no querer dos copias de ellos, entonces podría mantener los objetos en el conjunto, y los punteros o iteradores a los elementos establecidos en el vector. –

+0

@RC: bueno, mi propuesta no es ideal, porque los objetos se almacenan realmente dos veces. Una solución mucho mejor sería crear el contenedor con las propiedades necesarias desde cero. Sin embargo, escribir un nuevo contenedor requiere mucho más esfuerzo. – Vlad

1

No hay ninguna. La detección de duplicados sin clasificación o hash es una operación bastante costosa.

+0

std :: set ordena los elementos, ¿verdad? –

+3

@Gunner Pero también se ordena. Exactamente como dijo Nemanja. –

2

No es necesario volver a inventar la rueda, considere utilizar un contenedor boost::multi_index. Luego puede definir varios índices según el contenido de su corazón. La diferencia de rendimiento (si está preocupado) debería ser mínimo.

6

Sé que ha solicitado específicamente un contenedor STL, sin embargo, boost ya proporciona un contenedor multindex que hace lo que desea con su índice ordered_unique. Definitivamente vale la pena mirar en lugar de reinventar la rueda.

Solo quería señalar una buena alternativa.

Buena suerte.

Cuestiones relacionadas