用于(auto i:unordereded_map),保证每次都有相同的顺序

Is for(auto i : unordered_map) guaranteed to have the same order every time?

本文关键字:顺序 auto unordereded map 用于      更新时间:2023-10-16

当我在具有基于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++中有保证吗?

无序关联容器的迭代顺序只有在由于变异操作而重新哈希时才能更改(如C++11 23.2.5/8中所述)。在迭代之间不修改容器,因此顺序不会更改。

尽管规范没有明确说明在任何其他时间都不能进行重新哈希,但这样做会使容器上的所有迭代器无效,从而使任何迭代都不可能。

为什么不将它们构建在一起?

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优化字符串构建过程,如图所示,但尚不清楚这对

有多大帮助