30

for ループに基づく範囲で を 2 回反復する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++ で保証されていますか?

4

2 に答える 2

35

順序付けされていない連想コンテナーの反復順序は、変更操作の結果として再ハッシュする場合にのみ変更できます (C++11 23.2.5/8 で説明されているように)。反復間でコンテナーを変更していないため、順序は変更されません。

仕様では、それ以外のときに再ハッシュを行うことができないと明示的には述べていませんが、再ハッシュを行うと、コンテナーのすべての反復子が無効になり、反復がまったく不可能になります。

于 2013-08-18T16:48:12.367 に答える