Bir nesneyi, herhangi bir bağımsız değişken almamış olan std::map
içine yerleştirmek istiyorum. Ancak, std::map::emplace
anahtarın yanında en az bir ek argüman gerektiriyor gibi görünüyor. Peki sıfır argümanları kurucuya nasıl iletebilirim?Std :: map içine argüman olmayan yapıcı ile nesne nasıl yerleştirilir?
cevap
std::map<K, V>
öğe türü aslında std::pair<K, V>
, yani bir harita içine yerleşmesiyle zaman, tartışmalar std::pair
yapicisina iletilir. Bu yüzden sadece anahtarı geçemezsiniz: std::pair<K, V>
tek bir argümandan (aynı türden başka bir çift olmadıkça) yapılamaz.) Sıfır argümanları geçebilirsiniz, ancak sonra anahtar değer başlangıç durumuna getirilir. Muhtemelen istediğini değil.
V
eşlenen türü olan
M.emplace(k, V{});
. Değer başlatılacak ve konteynere taşınacaktır. (Hareket bile seçilebilir; emin değilim.)
Hareket edemiyorsanız ve yerinde oluşturulacak olan V
'a ihtiyacınız varsa, parçalı inşaat kurucusunu kullanmak zorundasınız.
M.emplace(std::piecewise_construct, std::make_tuple(k), std::make_tuple());
Bu k
kullanılarak birinci eleman ve sıfır bağımsız değişkenleri (değer başlatma) kullanılarak ikinci elemanı oluşturmak için std::pair
neden olur.
Açıkça bir pair
oluşturup map::emplace
o geçmesi veya std::pair
ait piecewise construction constructor kullanabilirsiniz.
struct foo {};
std::map<int, foo> m;
m.emplace(std::pair<int, foo>(1, {}));
m.emplace(std::piecewise_construct,
std::forward_as_tuple(2),
std::forward_as_tuple());
std::map
std::mutex
nesnesi oluştururken aynı sorunu yaşadım. Sorun, std::mutex
'un ne kopyalanabilir ne de hareketli olduğudur, bu yüzden "yerinde" oluşturmam gerekiyordu.
Kabul edilen yanıt bu durum için çalışmaz (M.emplace(k, V{});
V'nin hareketli olması gerekir). Ve karmaşık ve daha az okunabilir std::piecewise_construct
seçeneğini kullanmak istemedim (diğer cevaplarda yukarıdakilere bakınız).
Çözümüm çok daha basit - sadece operator[]
kullanın - varsayılan yapıcısını kullanarak değeri oluşturacak ve ona bir başvuru döndürecektir. Ya da yeni bir tane oluşturmadan mevcut öğeye bir başvuru bulup geri gönderir.
std::map<std::string, std::mutex> map;
std::mutex& GetMutexForFile(const std::string& filename)
{
return map[filename]; // constructs it inside the map if doesn't exist
}
- 1. std :: map
- 2. Lua Python'un içine nasıl yerleştirilir?
- 3. std :: map öğelerinin std :: vektörünü nasıl başlatabilirim?
- 4. std :: map başlatıcısı liste yapıcısı
- 5. Std :: map ile kullanılacak özel bir ayırıcı nasıl uygulanır?
- 6. std :: map <> :: olmayan copyable nesneleri ve tekdüze başlatma
- 7. Bir EditText'in içine bir Görünüm (Düğmeler vb. Ile) nasıl yerleştirilir?
- 8. UITextViewCell (gruplandırılmış) içine nasıl bir UITextField yerleştirilir?
- 9. Çıkış tablonun içine radyo düğmesi nasıl yerleştirilir?
- 10. std :: map genişletilmiş başlatıcı listesi nasıl olurdu?
- 11. std :: map karşılaştırıcısını atar mı?
- 12. std :: map değeri gdb'de nasıl yazdırılır
- 13. İlkel argüman yapıcı ile bir tür kayıt olun.
- 14. std :: vector <uchar> `std :: ostream` içine nasıl kaydedilir?
- 15. Hata tipi java.io.File [Belirsiz yapıcı argüman türleri]
- 16. Bir sınıf alır yapıcı ile nesne alay etmek nasıl?
- 17. C++ nesne başlatma ve yapıcı semantiği
- 18. Açık kopya yapıcı ve std :: sort
- 19. Kopyala std :: map for std :: set in C++
- 20. Scala-Makrolar kullanarak yapıcı argüman adlarını alma
- 21. Android ViewModel sıfır argüman yapıcı yok
- 22. const nesne ve const yapıcı
- 23. Derleyici, şablon parametrelerini (map std :: vector -> std :: vector)
- 24. Std :: map'e aktarılamaz ve taşınamaz bir nesne nasıl ayrılır?
- 25. std :: map default constructor açık mı?
- 26. std :: map ile boost :: foreach kullanmak mümkün mü?
- 27. Visual Studio 11 derleme zamanı hatası kullanarak std :: map
- 28. Std :: map neden eklemek istemiyor? [C++]
- 29. JQuery mobile içindeki metin kutusu içine nasıl simge yerleştirilir
- 30. İşaretleyicileri Google Map ile yerleştirme Django ile
Neden 'make_tuple' yerine forward_as_tuple' değil? – Yakk
@Yakk Peki, bu durumda, biraz yazarak kaydetmek için. Açıkçası, forward_as_tuple 'nin gerekli olduğu durumlar var. – Brian
Basit bir 'M [k];' nin 'piecewise_construct' malarkey ile aynı etkiye sahip olacağını unutmayın. –