Разница между std:: pair и std:: tuple только с двумя членами?
есть ли разница между std::pair
и std::tuple
только с двумя членами? (Кроме того, очевидно, что std::pair
требуются два и только два члена и tuple
может быть меньше...)
4 ответа:
есть некоторые различия:
std::tuple
не может быть стандартные-макета (по крайней мере, это не требуются быть по стандарту). Каждыйstd::pair<T, Y>
является стандартным макетом, если обаT
иY
стандартные-макета.это немного легче получить содержимое
pair
чем atuple
. Вы должны использовать вызов функции вtuple
корпусpair
case-это просто член поле.но это все.
это очень поздний ответ, но обратите внимание, что, потому что
std::pair
определяется с помощью переменных-членов, его размер не может быть оптимизирован с помощью оптимизация пустого базового класса (first
иsecond
должны занимать разные адреса, даже если один или оба являются пустым классом). Это усугубляется любыми требованиями выравниванияsecond_type
, Так что в худшем случае в результатеstd::pair
будет в основном в два раза больше, чем нужно.
std::tuple
разрешает доступ только через хелпера функции, поэтому он может быть получен из любого типа, если один или другой пуст, экономя на накладных расходах. Реализация GCC, по крайней мере, определенно делает это...вы можете ткнуть через заголовки, чтобы проверить это, но там же этой в качестве доказательства.
An
std::tuple
's имя длиннее (один дополнительный символ). Больше этих символов набирается правой рукой,поэтому большинству людей легче печатать.что сказал:
std::pair
может иметь только два значения - не ноль, один, три или более. два значения. Кортеж, однако, почти не имеет семантических ограничений на количество значений. Анstd::pair
, таким образом, является более точным, безопасным типом для использования, если вы действительно хотите указать пару значений.