Apakah ada perbedaan antara an std::pair
dan an std::tuple
dengan hanya dua anggota? (Selain yang jelas yang std::pair
membutuhkan dua dan hanya dua anggota dan tuple
mungkin memiliki lebih atau kurang ...)
Jawaban:
Ada beberapa perbedaan:
std::tuple
tidak pernah bisa dengan standar-layout (setidaknya, itu tidak diperlukan untuk menjadi oleh standar). Every std::pair<T, Y>
adalah tata letak standar jika keduanya T
dan Y
tata letak standar.
Sedikit lebih mudah untuk mendapatkan konten dari pair
file tuple
. Anda harus menggunakan panggilan fungsi dalam tuple
kasus ini, sedangkan pair
kasus hanya bidang anggota.
Tapi itu saja.
std::map
digunakan std::pair<const Key,T>
sebagai value_type
genap di C ++ 11. Di mana tepatnya tupel digunakan std::map
?
std::map
.
Ini adalah jawaban yang sangat terlambat tetapi perhatikan bahwa, karena std::pair
ditentukan dengan variabel anggota, ukurannya tidak dapat dioptimalkan menggunakan pengoptimalan kelas dasar yang kosong ( first
dan second
harus menempati alamat yang berbeda, meskipun salah satu atau keduanya adalah kelas kosong). Hal ini diperburuk oleh persyaratan penyelarasan apa pun second_type
, jadi dalam kasus terburuk, hasilnya std::pair
pada dasarnya akan menjadi dua kali ukuran yang dibutuhkan.
std::tuple
hanya mengizinkan akses melalui fungsi helper, jadi mungkin saja untuk berasal dari salah satu tipe jika salah satu atau lainnya kosong, menghemat biaya overhead. Implementasi GCC, paling tidak, pasti melakukan ini ... Anda dapat menyodok melalui header untuk memverifikasi ini, tetapi ada juga ini sebagai bukti.
[[no_unique_address]]
harus dihapusstd::pair
kerugiannya.
Sebuah std::tuple
's nama lebih panjang (satu karakter tambahan). Lebih banyak karakter yang diketik dengan tangan kanan, sehingga lebih mudah bagi kebanyakan orang untuk mengetik.
Artinya, std::pair
hanya dapat memiliki dua nilai - bukan nol, satu, tiga, atau lebih. DUA nilai. Namun, tupel hampir tidak memiliki batasan semantik pada jumlah nilai. Sebuah std::pair
, oleh karena itu, adalah lebih akurat, ketik jenis aman untuk digunakan jika Anda benar-benar ingin menentukan sepasang nilai-nilai.
std::tuple<>
adalah juga tipe-aman (bagaimana bisa itu tidak?), Dan 2
tidak semantis berbeda dari pair
.
Untuk apa nilainya, saya menemukan keluaran GDB dari std :: tuple jauh lebih sulit untuk dibaca. Jelas jika Anda membutuhkan lebih dari 2 nilai maka std :: pair tidak akan berfungsi, tetapi saya menganggap ini sebagai poin yang mendukung struct.
std::get<0>(tupleName)
dengan getter; GetX()
jauh lebih mudah dibaca dan lebih pendek. Ini memiliki kelemahan kecil yang jika Anda lupa untuk membuatnya menjadi const
metode seseorang bisa melakukan sesuatu yang bodoh seperti ini: GetX() = 20;
.
.first
dan.second
berguna, mereka tidak menawarkan bantuan jika anggota ketiga (atau lebih) diperlukan dalam perubahan kode. Saya perhatikan saya cenderung menggunakanstd::get
apa pun dalam Getters dengan cara itu saya tidak perlu mengubah semuanya, hanya tipe data danmake_pair
panggilan kemake_tuple
panggilan.