Apakah ada perbedaan antara an std::pairdan an std::tupledengan hanya dua anggota? (Selain yang jelas yang std::pairmembutuhkan dua dan hanya dua anggota dan tuplemungkin memiliki lebih atau kurang ...)
Jawaban:
Ada beberapa perbedaan:
std::tupletidak pernah bisa dengan standar-layout (setidaknya, itu tidak diperlukan untuk menjadi oleh standar). Every std::pair<T, Y>adalah tata letak standar jika keduanya Tdan Ytata letak standar.
Sedikit lebih mudah untuk mendapatkan konten dari pairfile tuple. Anda harus menggunakan panggilan fungsi dalam tuplekasus ini, sedangkan pairkasus hanya bidang anggota.
Tapi itu saja.
std::mapdigunakan std::pair<const Key,T>sebagai value_typegenap di C ++ 11. Di mana tepatnya tupel digunakan std::map?
std::map.
Ini adalah jawaban yang sangat terlambat tetapi perhatikan bahwa, karena std::pairditentukan dengan variabel anggota, ukurannya tidak dapat dioptimalkan menggunakan pengoptimalan kelas dasar yang kosong ( firstdan secondharus 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::pairpada dasarnya akan menjadi dua kali ukuran yang dibutuhkan.
std::tuplehanya 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::pairhanya 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 2tidak 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 constmetode seseorang bisa melakukan sesuatu yang bodoh seperti ini: GetX() = 20;.
.firstdan.secondberguna, mereka tidak menawarkan bantuan jika anggota ketiga (atau lebih) diperlukan dalam perubahan kode. Saya perhatikan saya cenderung menggunakanstd::getapa pun dalam Getters dengan cara itu saya tidak perlu mengubah semuanya, hanya tipe data danmake_pairpanggilan kemake_tuplepanggilan.