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 ...)
92
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.
.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.std::map
digunakanstd::pair<const Key,T>
sebagaivalue_type
genap di C ++ 11. Di mana tepatnya tupel digunakanstd::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
dansecond
harus menempati alamat yang berbeda, meskipun salah satu atau keduanya adalah kelas kosong). Hal ini diperburuk oleh persyaratan penyelarasan apa punsecond_type
, jadi dalam kasus terburuk, hasilnyastd::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.sumber
[[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. Sebuahstd::pair
, oleh karena itu, adalah lebih akurat, ketik jenis aman untuk digunakan jika Anda benar-benar ingin menentukan sepasang nilai-nilai.sumber
std::tuple<>
adalah juga tipe-aman (bagaimana bisa itu tidak?), Dan2
tidak semantis berbeda daripair
.Perhatikan bahwa dengan C ++ 17, seseorang dapat menggunakan antarmuka yang sama untuk membaca data dari pasangan dan tupel dengan dua elemen.
auto [a, b] = FunctionToReturnPairOrTuple();
Tidak perlu menggunakan
get<>
:)sumber
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.
sumber
std::get<0>(tupleName)
dengan getter;GetX()
jauh lebih mudah dibaca dan lebih pendek. Ini memiliki kelemahan kecil yang jika Anda lupa untuk membuatnya menjadiconst
metode seseorang bisa melakukan sesuatu yang bodoh seperti ini:GetX() = 20;
.