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