2013-08-18 10 views
11

std::unordered_mapの範囲をループベースの範囲に2回反復すると、その順序は等しくなることが保証されますか?(auto i: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++で保証されていますか?

+0

あなたはどこかでSQLインジェクションから保護していると教えてください。 –

+0

@ D.Shawley私は現時点ではありません。しかし、それはコンピュータゲームの節約についてです。私はゲームをコーディングして、アプリケーションコードの外部からSQLをまったく注入する方法はありません。 – danijar

+0

私は生の文字列連結によってSQL文字列を構築するのを見ているだけです。 –

答えて

19

ですが、順不同連想コンテナの繰り返し順序は、ときにのみ変更することができます(C++ 11 23.2.5/8で説明されているように)突然変異操作の結果として再ハッシュする。反復の間にコンテナを変更していないので、順序は変更されません。

仕様では、再ハッシングが他の時点では発生しないことを明示的に述べていませんが、そうすることで、コンテナ上のすべてのイテレータが無効になり、反復が不可能になります。

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

+1

代わりに 'ostringstream'の使用を検討してください。 –

+0

@ D.Shawleyはいこれはパフォーマンスが重視されるセクションです。そうでなければ、私は主に彼の問題への修正に焦点を当てていたかのどちらかで、これは読みやすさの面でより良いかもしれません。 –

+0

素晴らしい!最初のキーと値が与えられているので、私はそれをカットすることもできます。 'std :: string keys =" id "、値= to_string(Id); (自動i:シリアライズされた)キー+ = "、" + i。最初、値+ = "、" + i秒 "です。 – danijar

関連する問題