Sadece iki üyesi olan bir std::pair
ve bir arasında bir fark var mı std::tuple
? (Açık olanın yanı sıra, std::pair
iki ve yalnızca iki üye gerektirir ve tuple
az ya da çok olabilir ...)
Yanıtlar:
Bazı farklılıklar var:
std::tuple
asla standart düzende olamaz (en azından standart olması gerekmez ). Her std::pair<T, Y>
ikisi de standart düzendir T
ve Y
her ikisi de standart düzendir.
Bir içeriğini almak için biraz daha kolay pair
bir daha tuple
. Durum sadece bir üye alanı tuple
iken, pair
durumda bir işlev çağrısı kullanmanız gerekir .
Ama bununla ilgili.
std::map
kullanımlarını std::pair<const Key,T>
olarak value_type
bile 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 ( first
ve second
biri 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::tuple
yalnı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::tuple
adı 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::pair
yalnı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::pair
nedenle, 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 2
anlamsal 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 const
bunun gibi aptalca şeyler yapabiliriz yöntem birisi: GetX() = 20;
.
.first
ve olmasına rağmen.second
, bir kod değişikliğinde üçüncü (veya daha fazla) üye gerekiyorsa yardım sunmazlar.std::get
Herhangi 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ı.