2011-05-06 15 views
30

Si hay alguna diferencia entre it1 e it2?¿Hay alguna diferencia entre usar .begin() vs .end() para std :: inserter para std :: set?

std::set<sometype> s; 

auto it1 = std::inserter(s, s.begin()); 
auto it2 = std::inserter(s, s.end()); 
+1

¿Has leído alguna documentación? Esto es realmente fácil de descubrir a través de Google. –

+0

bueno, son dos iteradores diferentes, ¿eso ayuda? además de eso, estarás dividiendo cabellos ... (es decir, perfil para averiguarlo) – Nim

+0

@Nim - Me pregunto cómo está escrito en el estándar – Loom

Respuesta

30

En la práctica, no mucho. Si está insertando una gran cantidad de elementos ya en orden en un set vacío, el segundo será algo más rápido, pero eso es todo. std::insert_iterator llama al insert con el iterador; std::set lo interpreta como una sugerencia, y se inserta en tiempo constante (en lugar de lg n) si la inserción es inmediatamente anterior a la sugerencia. (En realidad, si el set está vacía, creo que tanto va a hacer exactamente lo mismo.)

6

De http://www.sgi.com/tech/stl/insert_iterator.html

En el caso de un Ordenada asociativa de contenedores, sin embargo, el iterador en el constructor del insert_iterator es casi irrelevante . Los nuevos elementos no necesariamente formarán un rango contiguo; aparecerán en el lugar apropiado en el contenedor, en orden ascendente por clave. El orden en que se insertan solo afecta la eficacia: la inserción de un rango ya ordenado en un contenedor asociativo ordenado es una operación O (N).

Cuestiones relacionadas