Есть ли разница между an std::pair
и an std::tuple
только с двумя членами? (Помимо очевидного, что std::pair
требует двух и только двух членов и tuple
может иметь больше или меньше ...)
92
Есть некоторые отличия:
std::tuple
никогда не может быть стандартным (по крайней мере, стандартным не требуется ). Каждый std::pair<T, Y>
является стандартным макетом , если оба T
и Y
являются стандартным макетом.
Получить содержимое файла a немного проще, pair
чем файла tuple
. Вы должны использовать вызов функции в tuple
случае, в то время как pair
случай - это просто поле члена.
Но это все.
.first
и.second
удобны, они не предлагают никакой помощи, если для изменения кода требуется третий (или более) член (ы). Я заметил, что я обычно используюstd::get
независимо в любых геттерах, поэтому мне не нужно менять все, только типы данных и любыеmake_pair
вызовыmake_tuple
вызовов.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
, Следовательно, является более точным, типобезопасен типом использовать , если вы действительно хотите , чтобы задать пару значений.источник
std::tuple<>
нет также типобезопасным (как это могло не быть?), И2
это не семантически отличаетсяpair
.Обратите внимание, что в C ++ 17 можно использовать один и тот же интерфейс для чтения данных как из пары, так и из кортежа с двумя элементами.
auto [a, b] = FunctionToReturnPairOrTuple();
Не нужно использовать
get<>
:)источник
Как бы то ни было, я считаю, что вывод std :: tuple GDB гораздо труднее читать. Очевидно, что если вам нужно более двух значений, то std :: pair не будет работать, но я считаю это аргументом в пользу структур.
источник
std::get<0>(tupleName)
в геттер;GetX()
намного легче читать и короче. Она имеет небольшой недостаток , что если вы забыли сделать этоconst
метод кто - то может сделать что - то глупое , как это:GetX() = 20;
.