(auto i:unordered_map)是否保证每次都有相同的顺序?

时间:2013-08-18 16:33:30

标签: c++ for-loop standards unordered-map

当我使用基于for循环的范围迭代std::unordered_map两次时,顺序是否保证相等?

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 += ");"

在上面的示例中,生成的字符串应采用该格式。因此,重要的是两次,迭代的顺序是相同的。

INSERT INTO table (key1, key2, key3) VALUES (value1, value2, value3);

这是否在C ++中得到保证?

2 个答案:

答案 0 :(得分:26)

无序关联容器的迭代顺序只能在由于变异操作而重新散列时发生变化(如C ++ 11 23.2.5 / 8中所述)。您没有在迭代之间修改容器,因此订单不会更改。

虽然规范没有明确声明在任何其他时间都不会发生重新散列,但这样做会使容器上的所有迭代器无效,使得任何迭代都变得不可能。

答案 1 :(得分:17)

为什么不一起构建它们?

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 ")";

看起来更好了。

请注意,如果此部分对性能至关重要,您可以考虑使用std :: stringstream优化字符串构建过程,如here所示,尽管它是not clear how much that might help