plus - unordered_map c++ library
¿Se garantiza que para(auto i: unordered_map) tenga el mismo orden cada vez? (2)
Cuando itero sobre un std::unordered_map
con el rango basado en bucle dos veces, ¿se garantiza que el orden sea igual?
std::unordered_map<std::string, std::string> map;
std::string query = "INSERT INTO table (";
bool first = true;
for(auto i : map)
{
if(first) first = false;
else query += ", ";
query += i.first;
}
query += ") ";
query += "VALUES (";
first = true;
for(auto i : map)
{
if(first) first = false;
else query += ", ";
query += i.second;
}
query += ");"
En el ejemplo anterior, la cadena resultante debe estar en esa forma. Por lo tanto, es importante que en ambas ocasiones, el orden de iteración sea el mismo.
INSERT INTO table (key1, key2, key3) VALUES (value1, value2, value3);
¿Está esto garantizado en C ++?
¿Por qué no construirlos juntos?
for(auto i : map)
{
if(first) first = false;
else{
keys += ", ";
query += ", ";
}
keys += i.first;
values += i.second;
}
std::string query = "INSERT INTO table (" + keys + ") VALUES (" + values ")";
Se ve mejor también imo.
Tenga en cuenta que si esta sección es crítica para el rendimiento, podría considerar la optimización del proceso de creación de cadenas con std :: stringstream como se muestra here , aunque no está claro cuánto podría ayudar.
El orden de iteración de los contenedores asociativos desordenados solo puede cambiar al volver a lavar como resultado de una operación de mutación (como se describe en C ++ 11 23.2.5 / 8). No está modificando el contenedor entre iteraciones, por lo que el orden no cambiará.
Aunque la especificación no establece explícitamente que no se puede repetir la repetición en ningún otro momento, hacerlo invalidaría todos los iteradores sobre el contenedor, haciendo imposible cualquier iteración.