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

dan*_*jar 21 c++ standards for-loop unordered-map

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

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 += ");"
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,结果字符串应采用该形式.因此,重要的是两个时间,迭代的顺序是相同的.

INSERT INTO table (key1, key2, key3) VALUES (value1, value2, value3);
Run Code Online (Sandbox Code Playgroud)

这是用C++保证的吗?

Mik*_*our 28

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

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


Kar*_*k T 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 ")";
Run Code Online (Sandbox Code Playgroud)

看起来更漂亮imo.

请注意,如果这一部分的性能很关键,你可以考虑优化与性病串建设进程:: stringstream的如图所示这里,虽然它并不清楚有多少,这可能有助于