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