2013-08-18 14 views
11

, eşit olması garanti sırasıdır?(unordered_map oto i) var mı? İki kez döngü tabanlı aralığı ile bir <code>std::unordered_map</code> üzerinde yineleme zaman

Yukarıdaki örnekteki sonuç dizgisi bu biçimde olmalıdır. Bu nedenle, iki kez de yineleme sırasının aynı olması önemlidir.

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

Bu, C++ ile garanti edilir mi?

+0

bir yere SQL enjeksiyonu karşı koruduğunu söyle. –

+0

@ D.Shawley Şu an yokum. Ama bilgisayar oyununun kurtarılmasıyla ilgili. Oyunu kodluyorum ve SQL'in uygulama kodunun dışından herhangi bir şekilde enjekte edilmesinin hiçbir yolu yoktur. – danijar

+0

Sadece çiğ dize sıralanmasıyla SQL dizesi oluştururken her gördüğünüzde yaltaklanmak. –

cevap

19

sadece değiştirebilir sırasız ilişkisel konteynerlerin yineleme düzeni olsa

, sen dize bina std ile süreci :: stringstream optimize düşünebiliriz, lütfen unutmayın Mutasyon işleminin bir sonucu olarak yeniden canlandırma (C++ 11 23.2.5/8'de açıklandığı gibi). Konteynır iterasyonlar arasında değiştirilmiyorsunuz, bu yüzden sipariş değişmeyecek.

şartname açıkça, kabın her yerinde yineleyicinızı geçersiz olur bunu yaparken, diğer herhangi bir zamanda oluşamaz rehashing hiç de ihtimal herhangi yinelemeyi yapma ifade etmese de

.

17

Neden bunları birlikte inşa?

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

Çok güzel görünüyor. Bu bölümde performans kritik ise here gösterildiği gibi not clear how much that might help

+1

Bunun yerine "ostringstream" kullanmayı düşünün, ancak bu daha iyi bir yaklaşım. –

+0

@ D.Shawley evet, bu muhtemelen performans yoğun bir bölümse. Başka bir deyişle, daha çok okunabilirlik nedenlerinden daha iyi olabilirdi, ya her ikisi de kendi problemine olan düzeltmeye odaklanmıştım. –

+0

Harika! Onu bile kesebilirim çünkü ilk anahtar ve değer verildi. std :: string keys = "id", değerler = to_string (Id); (auto i: serialized) tuşları için + = "," + i.first, değerler + = "," + i.second; '. – danijar