Есть ли разница между 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вызовов.