'size_t' vs 'container :: size_type'

108

Apakah ada perbedaan antara size_tdancontainer::size_type ?

Apa yang saya pahami size_tlebih umum dan dapat digunakan untuk size_types semua .

Tetapi apakah container::size_typedioptimalkan untuk jenis wadah tertentu?

Charles Khunt
sumber

Jawaban:

108

Kontainer standar mendefinisikan size_typesebagai typedef ke Allocator::size_type(Allocator adalah parameter template), yang untuk std::allocator<T>::size_typeini biasanya didefinisikan sebagaisize_t (atau jenis yang kompatibel). Jadi untuk case standar, keduanya sama.

Namun, jika Anda menggunakan pengalokasi khusus, jenis dasar yang berbeda dapat digunakan. Jadi container::size_typelebih disukai untuk umum maksimum.

Evan Teran
sumber
2
Bisakah Anda menjelaskan jawaban ini? Saya telah melihat kembali draf standar sejauh ini N1804dan saya tidak melihat adanya hubungan antara Allocator::size_typedan size_type. Sekilas libstdc ++ tidak menunjukkan sesuatu yang mirip dengan ini juga.
Shafik Yaghmour
1
@ShafikYaghmour, Jadi jawaban ini agak ketinggalan jaman, tetapi untuk memaksimalkan portabilitas menurut saya sarannya masih terdengar: C ++ 03 ditentukan "Tabel 32: size_type: jenis yang dapat mewakili ukuran objek terbesar dalam model alokasi." Pada saat itu, size_tapakah taruhan implementasi praktis dari kendala tersebut. Namun, di C ++ 11, sekarang pada dasarnya didefinisikan sebagai: std::make_unsigned<X::difference_type>::typesecara default. Yang dalam prakteknya, mungkin akan sama atau cocok dengannya size_t.
Evan Teran
2
PEDULI jawabannya salah .... lihat stackoverflow.com/questions/4849678/… TL: DR: pengalokasi size_type harus size_t dan di C ++ 17 size_type akan dihentikan sebagaimana adanya.
pengguna3063349
1
@ user3063349 Saya tidak melihat apa pun di halaman itu, atau di C ++ 2017 Standard (23.10.8), untuk mengisyaratkan size_typedeprecation. Apa yang memberi?
Marc. 2377
42
  • size_tdidefinisikan sebagai tipe yang digunakan untuk ukuran sebuah objek dan bergantung pada platform .
  • container::size_typeadalah tipe yang digunakan untuk jumlah elemen dalam penampung dan bergantung pada penampung .

Semua stdpenampung digunakan size_tsebagai size_type, tetapi setiap vendor pustaka independen memilih jenis yang menurutnya sesuai untuk penampungnya.

Jika Anda melihat , Anda akan menemukan bahwa size_typekontainer Qt bergantung pada versi. Di Qt3 itu unsigned intdan di Qt4 itu diubah menjadi int.

TimW
sumber
1
Saya merasa agak aneh memiliki ukuran sesuatu yang diekspresikan sebagai int. Bisakah kita memiliki ukuran negatif untuk wadah?
Mihai Todor
10
@MihaiTodor: bukan hal yang aneh bagi orang untuk menggunakan tipe bertanda tangan untuk segala hal, saya kira Qt mengikutinya. Alasannya adalah bahwa operasi campuran (dalam perbandingan tertentu) adalah daerah bencana sehingga banyak orang lebih suka menghindari penggunaan nomor yang tidak bertanda tangan, daripada harus berurusan dengan dan / atau menghindari operasi campuran. Hanya karena tipe unsigned tidak dapat mengekspresikan angka negatif, tidak berarti Anda harus menggunakannya untuk angka yang tidak boleh negatif :-) Saya akui saya terkejut itu intbukan ssize_t, intagak kecil.
Steve Jessop
2
"Semua kontainer standar menggunakan size_t sebagai size_type" sangat salah dan menyesatkan. Ya, mereka biasanya melakukannya (setidaknya semua kompiler saya melakukannya dengan cara itu) tetapi referensi bahasa C ++ tidak menyatakan, bahwa itu harus serupa untuk semua kontainer stl !! jadi perhatian
pengguna3063349
8

Karena std::[w]string, std::[w]string::size_typesama dengan std::allocator<T>::size_type, yang sama dengan std::size_t. Untuk penampung lain, itu beberapa implementasi yang ditentukan jenis integer tidak bertanda tangan.

Kadang-kadang berguna untuk memiliki tipe yang tepat, jadi misalnya seseorang tahu di mana tipe tersebut membungkus (like, to UINT_MAX) sehingga dia dapat memanfaatkannya. Atau untuk template, di mana Anda benar-benar perlu meneruskan dua jenis yang identik ke template fungsi / kelas.

Seringkali saya menemukan saya menggunakan size_tuntuk singkatnya atau iterator. Dalam kode generik, karena Anda umumnya tidak tahu dengan contoh kontainer apa template Anda digunakan dan berapa ukuran kontainer itu, Anda harus menggunakan Container::size_typetypedef jika Anda perlu menyimpan ukuran kontainer.

Johannes Schaub - litb
sumber