두 멤버 만있는 std :: pair와 std :: tuple의 차이점은 무엇입니까?


92

멤버가 두 명 뿐인 an std::pair과 an 의 차이가 std::tuple있나요? ( std::pair두 명만 필요하고 tuple더 많거나 적을 수 있는 명백한 것 외에도 ...)

답변:


86

몇 가지 차이점이 있습니다.

  1. std::tuple표준 레이아웃이 될 수 없습니다 (적어도 표준에 따라야필요 는 없습니다 ). 모든는 std::pair<T, Y>두 경우 표준 레이아웃입니다 TY표준 레이아웃입니다.

  2. 의 내용을 가져 오는 pair것이 tuple. 케이스는 단지 멤버 필드 tuple일 때 함수 호출을 사용해야 pair합니다.

하지만 그게 다입니다.


5
"튜플보다 쌍에서 데이터를 가져 오는 것이 조금 더 쉽습니다. 조금." 나는 눈치 챘다. : P하지만 .first.second세 번째 (또는 그 이상)의 회원 (들)의 코드를 변경에 필요한 경우 편리, 그들은 어떤 도움을 제공하지 않습니다. 나는 std::get모든 게터에 관계없이 모든 것을 변경할 필요가 없으며 데이터 유형과 make_pair호출 호출에 관계없이 사용하는 경향이 있음을 알았습니다 make_tuple.
Casey

C ++ 11에서 짝수로 std::map사용하는 std::pair<const Key,T>것으로 보입니다 value_type. 튜플은 정확히 어디에 사용 std::map됩니까?
nknight

@nknight : ... 내가 왜 그렇게 말했는지 모르겠습니다. 또는 std::map.
Nicol Bolas 2012 년

1
@Yakk : 음, ""를 누릅니다. 내 IDE는 구성원 목록을 표시합니다. 나는 사람들이 철자가 필요하다고 생각하지 않았습니다.
Nicol Bolas 2016 년

2
C ++ 17의 구조적 바인딩이 이미이 답변의 1 점과 2 점을 모두 무효화하는지 궁금합니다. 그렇다면 이것의 C ++ 17 버전도 추가하십시오.
sandthorn

29

이것은 매우 늦게 대답 때문이 아니라, 참고 인 std::pair멤버 변수로 정의되고, 그 크기는 사용하여 최적화 할 수없는 빈 기본 클래스 최적화를 ( first그리고 second하나 또는 둘 모두가 빈 클래스 인 경우에도 서로 다른 주소를 차지해야합니다). 이는 정렬 요구 사항 second_type이 무엇이든간에 악화 되었으므로 최악의 경우 결과 std::pair는 기본적으로 필요한 크기의 두 배가 될 것입니다.

std::tuple도우미 함수를 통해서만 액세스 할 수 있으므로 둘 중 하나가 비어있는 경우 두 유형에서 파생되어 오버 헤드를 절약 할 수 있습니다. 적어도 GCC의 구현, 확실히이 작업을 수행합니다 ... 당신이 이것을 확인하기 위해 헤더를 통해 찌를뿐만 아니라 거기에 수 증거로.


4
물론 C ++ 20[[no_unique_address]]std::pair 은의 단점을 제거해야합니다 .
Deduplicator

"std :: tuple은 도우미 함수를 통해서만 액세스를 허용합니다."또는 C ++ 17 구조화 된 바인딩. 요즘 많은 합리적인 C ++ 답변이 너무 빨리 구식이되어 슬프다. :-(
cosimo193

29

std::tuple의 이름은 이상 (한 여분의 문자)입니다. 더 많은 문자가 오른손으로 입력되므로 대부분의 사람들이 입력하기가 더 쉽습니다.

즉, std::pair0, 1, 3 또는 그 이상이 아닌 두 개의 값만 가질 수 있습니다. 두 가지 값. 그러나 튜플에는 값 수에 대한 의미 적 제한이 거의 없습니다. 은 std::pair, 그러므로, 당신이 실제로 값의 쌍을 지정하려는 경우에 사용하는보다 정확한 입력 안전 유형입니다.


20
LOL! 입력 방법을 고려하는 것이 훌륭합니다! 나는 아마도 '튜플'보다 20 % 이상 더 빨리 '페어'를 입력 할 것임을 지적하고 싶습니다. 이것은 내 손이 각 문자를 번갈아 입력하기 때문입니다. RHS : p, LHS : a, RHS : i, LHS : r. 적어도 저에게는 그렇게하기가 더 쉽습니다! -하지만 여전히 +1을받습니다!
Richard Corden 2011

15
" 따라서 std :: pair는 실제로 값 쌍을 지정하려는 경우 사용할 수있는 더 정확한 유형 안전 유형입니다. "더 유형 안전하거나 "정확한"것이 아니라 의도를 나타낼뿐입니다. 더 직접적으로.
ildjarn

1
@Arafangion : std::tuple<>없습니다 또한 입력 안전한 (? 어떻게 수 없습니다), 그리고 2더 이상 의미 다릅니다 pair.
ildjarn

1
" 따라서 std :: pair는 사용하기에 더 정확하고 안전한 유형입니다. "그리고 모든 영어 사용자는 'pair'와 'two'를 완전히 동의어로 생각할 것입니다. : -]
ildjarn

5
@ildjam : 우리는 여기서 머리카락을 쪼개고 있지만, 완전히 동의어 는 아닙니다 . "두 신발"이라고하실 때 "두 신발, 양쪽 모두 왼쪽 신발 일 수 있습니다"를 의미합니까, 아니면 "신발 한 켤레"를 의미합니까 (하나는 항상 왼쪽이고 다른 하나는 항상 오른쪽) ?
Arafangion

9

C ++ 17에서는 동일한 인터페이스를 사용하여 두 요소가있는 쌍과 튜플 모두에서 데이터를 읽을 수 있습니다.

auto [a, b] = FunctionToReturnPairOrTuple();

사용할 필요가 없습니다 get<>:)


3

그만한 가치는 std :: tuple의 GDB 출력이 읽기가 훨씬 더 어렵다는 것을 알았습니다. 분명히 두 개 이상의 값이 필요하면 std :: pair가 작동하지 않지만 구조체에 유리한 점이라고 생각합니다.


그래서 수업에서 그것들을 사용할 때 std::get<0>(tupleName)게터로 총선을 감싼 것입니다 . GetX()읽기 쉽고 짧습니다. const방법 으로 만드는 것을 잊으면 누군가가 다음과 같이 어리석은 일을 할 수 있다는 작은 단점이 있습니다 GetX() = 20;.
Casey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.