Есть ли разница между std::pair
и std::tuple
только с двумя членами? (Помимо очевидного, что std::pair
требуется два и только два члена, а у tuple
может быть больше или меньше...)
Разница между std:: pair и std:: tuple с двумя членами?
Ответ 1
Есть некоторые различия:
std::tuple
никогда не может быть по стандартному макету (по крайней мере, по стандарту это не обязательно). Каждыйstd::pair<T, Y>
является стандартным макетом, если обаT
иY
являются стандартным макетом.Немного легче получить содержимое
pair
, чемtuple
. Вы должны использовать вызов функции в случаеtuple
, в то время как делоpair
- просто поле члена.
Но это об этом.
Ответ 2
Это очень поздний ответ, но обратите внимание, что, поскольку std::pair
определяется переменными-членами, его размер не может быть оптимизирован с помощью пустая оптимизация базового класса (first
и second
должны занимать разные адреса, даже если один или оба являются пустым классом). Это усугубляется любыми требованиями к выравниванию second_type
, поэтому в худшем случае результирующий std::pair
будет в основном в два раза больше, чем он должен быть.
std::tuple
разрешает доступ только через вспомогательные функции, поэтому он может быть получен из любого типа, если тот или иной пуст, сохраняя накладные расходы. Реализация GCC, по крайней мере, определенно делает это... вы можете пробивать заголовки, чтобы проверить это, но там также this в качестве доказательства.
Ответ 3
Имя std::tuple
длиннее (один дополнительный символ). Больше этих символов набирается с правой стороны, поэтому для большинства людей это проще.
Тем не менее, std::pair
может иметь только два значения - не ноль, один, три или более. ДВЕ значения. Однако кортеж почти не имеет смыслового ограничения на количество значений. Таким образом, std::pair
является более точным, безопасным типом типа, если вы действительно хотите указать пару значений.
Ответ 4
Для чего это стоит, я считаю, что вывод GDB для std:: tuple гораздо труднее прочитать. Очевидно, если вам нужно больше двух значений, то std:: pair не будет работать, но я считаю это точкой в пользу структур.
Ответ 5
Обратите внимание, что с C++ 17 можно использовать один и тот же интерфейс для чтения данных из пары и кортежа с двумя элементами.
auto [a, b] = FunctionToReturnPairOrTuple();
Не нужно использовать get<>
:)