Разница между std :: pair и std :: tuple только с двумя членами? - PullRequest
70 голосов
/ 14 июля 2011

Есть ли разница между std::pair и std::tuple только с двумя членами?(Помимо очевидного, что std::pair требует двух и только двух членов, а tuple может иметь меньше ...)

Ответы [ 5 ]

71 голосов
/ 14 июля 2011

Существуют некоторые различия:

  1. std::tuple никогда не может быть стандартным макетом (по крайней мере, это не требуется длябыть по стандарту).Каждый std::pair<T, Y> является стандартным макетом, если оба T и Y являются стандартным макетом.

  2. Немного легче получить содержимое pair, чем tuple.Вы должны использовать вызов функции в случае tuple, в то время как случай pair - это просто поле члена.

Но это все.

25 голосов
/ 26 февраля 2013

Это очень поздний ответ, но обратите внимание, что, поскольку std::pair определено с помощью переменных-членов, его размер нельзя оптимизировать с помощью пустой оптимизации базового класса (first и second должны занимать разные адреса, даже если один или оба - пустой класс). Это усугубляется требованиями к выравниванию second_type, поэтому в худшем случае результирующий std::pair будет в два раза больше необходимого.

std::tuple разрешает доступ только через вспомогательные функции, поэтому он может быть производным от любого типа, если один или другой пуст, экономя на накладных расходах. Реализация GCC, по крайней мере, определенно делает это ... вы можете просмотреть заголовки, чтобы проверить это, но есть также этот в качестве доказательства.

20 голосов
/ 14 июля 2011

Имя std::tuple длиннее (на один дополнительный символ). Большая часть этих символов набирается правой рукой, поэтому большинству людей легче печатать.

Тем не менее, std::pair может иметь только два значения - не ноль, один, три или более. ДВА ценности. Однако кортеж практически не имеет семантического ограничения на число значений. Поэтому std::pair является более точным типом безопасного типа для использования, если вы действительно хотите указать пару значений.

3 голосов
/ 26 июля 2011

Несмотря на это, я считаю, что вывод GDB из std :: tuple намного сложнее для чтения.Очевидно, что если вам нужно более 2 значений, тогда std :: pair не будет работать, но я считаю, что это точка зрения в пользу структур.

2 голосов
/ 29 мая 2019

Обратите внимание, что в C ++ 17 можно использовать один и тот же интерфейс для чтения данных как из пары, так и из кортежа с двумя элементами.

auto [a, b] = FunctionToReturnPairOrTuple();

Не нужно использовать get<>:)

...