Sadece iki üyesi olan bir std::pairve bir arasında bir fark var mı std::tuple? (Açık olanın yanı sıra, std::pairiki ve yalnızca iki üye gerektirir ve tupleaz ya da çok olabilir ...)
Yanıtlar:
Bazı farklılıklar var:
std::tupleasla standart düzende olamaz (en azından standart olması gerekmez ). Her std::pair<T, Y>ikisi de standart düzendir Tve Yher ikisi de standart düzendir.
Bir içeriğini almak için biraz daha kolay pairbir daha tuple. Durum sadece bir üye alanı tupleiken, pairdurumda bir işlev çağrısı kullanmanız gerekir .
Ama bununla ilgili.
std::mapkullanımlarını std::pair<const Key,T>olarak value_typebile C ++ 11. Tuples tam olarak nerede kullanılır std::map?
std::map.
Bu çok geç bir cevaptır, ancak std::pairüye değişkenlerle tanımlandığı için boyutunun boş temel sınıf optimizasyonu kullanılarak optimize edilemeyeceğini ( firstve secondbiri veya her ikisi de boş sınıf olsa bile farklı adresleri işgal etmesi gerektiğini) unutmayın. Bu second_type, hizalama gereksinimleri ne olursa olsun daha da şiddetlendi , bu nedenle en kötü durumda sonuç std::pair, temelde olması gerekenin iki katı boyutta olacaktır.
std::tupleyalnızca yardımcı işlevler aracılığıyla erişime izin verir, bu nedenle, biri veya diğeri boşsa, ek yükten tasarruf ederek her iki türden de türetilmesi mümkündür. GCC'nin uygulaması, en azından, kesinlikle bunu yapıyor ... Bunu doğrulamak için başlıkları karıştırabilirsiniz, ancak bu da kanıt olarak var.
[[no_unique_address]]std::pair dezavantajını ortadan kaldırması gerekir .
Bir std::tupleadı daha uzundur (fazladan bir karakter). Bu karakterlerin çoğu sağ el ile yazılır, çoğu insan için yazması çok daha kolaydır.
Bununla birlikte, std::pairyalnızca iki değere sahip olabilir - sıfır, bir, üç veya daha fazla olamaz. İKİ değer. Bununla birlikte, bir demet değerlerin sayısı üzerinde neredeyse hiçbir anlamsal sınırlamaya sahip değildir. Bu std::pairnedenle, aslında bir değer çifti belirtmek istiyorsanız kullanmak için daha doğru, güvenli bir türdür.
std::tuple<>aynı zamanda tür açısından güvenlidir (nasıl olamaz?) Ve 2anlamsal olarak pair.
Değeri ne olursa olsun, std :: tuple'ın GDB çıktısını okumayı çok daha zor buluyorum. Açıkçası, 2'den fazla değere ihtiyacınız varsa, std :: pair çalışmayacaktır, ancak bunu yapıların lehine bir nokta olarak görüyorum.
std::get<0>(tupleName)bir alıcıya sarıyorum; GetX()okuması çok daha kolay ve kısadır. Size bir yapmayı unutursanız o küçük dezavantajı vardır constbunun gibi aptalca şeyler yapabiliriz yöntem birisi: GetX() = 20;.
.firstve olmasına rağmen.second, bir kod değişikliğinde üçüncü (veya daha fazla) üye gerekiyorsa yardım sunmazlar.std::getHerhangi bir Getters'da ne olursa olsun kullanmaya meyilli olduğumu fark ettim , bu şekilde her şeyi değiştirmeme gerek yok, sadece veri türlerini vemake_pairçağrılara yapılanmake_tupleçağrıları.