Чи є різниця між 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
дзвінки.