'size_t' vs 'container :: size_type'


108

size_tVe arasında bir fark var mı container::size_type?

Anladığım şey size_tdaha genel ve herhangi bir size_typee-posta için kullanılabilir .

Ancak container::size_typebelirli konteyner türleri için optimize edilmiş mi?

Yanıtlar:


108

Standart kaplar , tipik olarak (veya uyumlu bir tür) olarak tanımlanan (Ayırıcı bir şablon parametresidir) size_typeiçin typedef olarak tanımlanır . Yani standart durum için bunlar aynı.Allocator::size_typestd::allocator<T>::size_typesize_t

Bununla birlikte, özel bir ayırıcı kullanırsanız, farklı bir temel tür kullanılabilir. Bu yüzden container::size_typemaksimum genellik için tercih edilir.


2
Bu cevabı açıklayabilir misin? Ben kadar geriye kadar taslak standartları geri baktım N1804ve ben arasında herhangi bir ilişki görmüyorum Allocator::size_typeve size_type. Libstdc ++ 'ya hızlı bir bakış da buna benzer bir şey göstermez.
Shafik Yaghmour

1
@ShafikYaghmour, Yani bu yanıt biraz güncel değil, ancak taşınabilirliği en üst düzeye çıkarmak için tavsiyenin hala geçerli olduğunu düşünüyorum: C ++ 03 "Tablo 32: boyut_türü: ayırma modelindeki en büyük nesnenin boyutunu temsil edebilen bir tür." O zamanlar, size_tbahis bu kısıtlamaların pratik uygulamasıydı. Ancak, C ++ 11'de artık temelde şu şekilde tanımlanmaktadır: std::make_unsigned<X::difference_type>::typevarsayılan olarak. Pratikte muhtemelen aynı veya uyumlu olacaktır size_t.
Evan Teran

2
DİKKATLİ yanıt yanlış .... bkz. Stackoverflow.com/questions/4849678/… TL: DR: ayırıcıların size_type boyut_t olması gerekir ve C ++ 17'de boyut_türü olduğu gibi kullanımdan kaldırılacaktır.
user3063349

1
@ user3063349 Ne o sayfada ne de C ++ 2017 Standardında (23.10.8), size_typekullanımdan kaldırıldığına dair ipucu verecek hiçbir şey görmüyorum . Ne oluyor?
Marc

42
  • size_tbir nesnenin boyutu için kullanılan tür olarak tanımlanır ve platforma bağlıdır .
  • container::size_typekaptaki öğe sayısı için kullanılan ve kaba bağımlı olan türdür .

Tüm stdkaplar size_tolarak kullanılır size_type, ancak her bağımsız kitaplık satıcısı, kabı için uygun bulduğu bir türü seçer.

Bakarsan , size_typeQt kapsayıcılarının sürüme bağlı olduğunu göreceksiniz . Vt3'te öyleydi unsigned intve Vt4'te olarak değiştirildi int.


1
Bir şeyin boyutunun int olarak ifade edilmesini biraz tuhaf buluyorum. Bir kap için hiç negatif boyutumuz olabilir mi?
Mihai Todor

10
@MihaiTodor: İnsanların her şey için imzalı tipler kullanması alışılmadık bir şey değil, sanırım Qt davayı takip ediyor. Bunun nedeni, karışık operasyonların (özellikle karşılaştırmaların) öyle bir felaket alanı olmasıdır ki, birçok insan, karışık operasyonlarla uğraşmak ve / veya bunlardan kaçınmak yerine sayılar için işaretsiz türleri kullanmaktan kaçınmayı tercih eder. İmzasız türleri negatif sayılar ifade edemez diye, anlamına gelmez sahip negatif olamaz numaraları için bunları kullanmak için :-) Ben öyle şaşırdım itiraf intziyade ssize_t, intküçük türüdür.
Steve Jessop

2
"Tüm standart kapsayıcılar size_t'yi boyut_türü olarak kullanır" çok çok yanlış ve yanıltıcıdır. Evet, GENELLİKLE yaparlar (en azından tüm derleyicilerim bu şekilde yaptı) ancak C ++ dil referansı tüm stl kapsayıcıları için benzer olması gerektiğini belirtmiyor !! çok bakım
user3063349


8

Çünkü std::[w]string, std::[w]string::size_typeeşittir std::allocator<T>::size_type, eşittir std::size_t. Diğer kapsayıcılar için, bazı uygulama tanımlı işaretsiz tamsayı türüdür.

Bazen tam türüne sahip olmak yararlıdır, bu nedenle örneğin yazının nereye (gibi UINT_MAX) sarıldığını bilir, böylece onu kullanabiliriz. Ya da işlev / sınıf şablonlarına gerçekten aynı iki türü geçirmeniz gereken şablonlar için.

Genellikle size_tkısalık veya yinelemeler için kullandığımı buluyorum . Genel kodda, genellikle şablonunuzun hangi konteyner örneğiyle kullanıldığını ve bu konteynerlerin hangi boyutta olduğunu bilmediğiniz Container::size_typeiçin, konteyner boyutunu saklamanız gerekirse typedef'i kullanmanız gerekecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.