Чи є різниця між a std::pairта an std::tupleлише з двома членами? (Окрім очевидного, що std::pairвимагає двох і лише двох членів і tupleможе мати більше або менше ...)
Відповіді:
Є деякі відмінності:
std::tupleніколи не може бути за стандартним макетом (принаймні, це не обов’язково за стандартом). Кожен std::pair<T, Y>стандартний макет, якщо обидва Tі Yстандартний макет.
Отримати вміст a, pairніж a tuple. У випадку потрібно використовувати виклик функції tuple, тоді як pairрегістр - це лише поле-член.
Але це все.
std::mapвикористовується std::pair<const Key,T>як value_typeпарне в C ++ 11. Де саме використовуються кортежі std::map?
std::map.
Це дуже пізня відповідь, але зауважте, що, оскільки std::pairвона визначається змінними-членами, її розмір не може бути оптимізований за допомогою порожньої оптимізації базового класу ( firstі secondповинен займати різні адреси, навіть якщо один або обидва є порожнім класом). Це посилюється будь-якими вимогами до вирівнювання second_type, тому в гіршому випадку це виходитьstd::pair буде в основному вдвічі більшим, ніж він повинен бути.
std::tupleнадає доступ лише за допомогою допоміжних функцій, тому можливо, щоб він виходив з будь-якого типу, якщо той чи інший порожній, заощаджуючи на витратах. Реалізація ССЗ, по крайней мере, безумовно , робить це ... ви можете протикати заголовки , щоб переконатися в цьому , але є і це в якості доказу.
[[no_unique_address]] повинен усунути std::pairнедолік.
std::tupleІм'я «s більше (один додатковий символ). Більшість із цих символів набираються правою рукою, тому більшій людині набирати текст легше.
Тим не менш, std::pairможе мати лише два значення - не нуль, одне, три або більше. ДВІ значення. Проте кортеж майже не має семантичного обмеження на кількість значень. std::pairТаким чином, An є більш точним, безпечним для типу типом типом для використання, якщо ви насправді хочете вказати пару значень.
std::tuple<>немає також тіпобезопасним (як це могло не бути?), І 2це не семантично відрізняється pair.
Наскільки це варте, мені здається, що вихід GDB std :: tuple набагато складніший для читання. Очевидно, якщо вам потрібно більше 2 значень, тоді std :: pair не буде працювати, але я вважаю це моментом на користь структур.
std::get<0>(tupleName)у геттер; GetX()набагато легше для читання та коротше. Вона має невеликий недолік , що якщо ви забули зробити це constметод хто - то може зробити що - то дурне , як це: GetX() = 20;.
.firstі.secondє зручними, вони не надають допомоги, якщо для зміни коду потрібен третій (або більше) учасник (и). Я помітив, що, як правило, використовуюstd::getв будь-яких Getters, щоб мені не потрібно було змінювати все, лише типи даних та будь-якіmake_pairдзвінки наmake_tupleдзвінки.