'size_t'대 'container :: size_type'


108

사이에 차이가인가 size_t하고 container::size_type?

내가 이해하는 size_t것은 더 일반적이며 모든 size_types에 사용할 수 있습니다 .

하지만 container::size_type특정 종류의 컨테이너에 최적화되어 있습니까?

답변:


108

표준 컨테이너 는 일반적으로 for (또는 호환 가능한 유형) size_type로 정의되는 Allocator::size_type(Allocator는 템플릿 매개 변수)에 대한 typedef로 정의합니다 . 따라서 표준 사례의 경우 동일합니다.std::allocator<T>::size_typesize_t

그러나 사용자 지정 할당자를 사용하는 경우 다른 기본 유형을 사용할 수 있습니다. 따라서 container::size_type최대 보편성을 위해 바람직합니다.


2
이 답변을 명확히 할 수 있습니까? 나는 지금까지 다시 한 초안 표준에서 다시 보았다 N1804나는 사이의 관계가 표시되지 않습니다 Allocator::size_typesize_type. libstdc ++를 훑어 봐도 이와 유사한 것은 표시되지 않습니다.
Shafik Yaghmour

1
@ShafikYaghmour,이 답변은 약간 구식이지만 이식성을 극대화하기 위해 조언은 여전히 ​​옳다고 생각합니다. C ++ 03은 "표 32 : size_type : 할당 모델에서 가장 큰 개체의 크기를 나타낼 수있는 유형"을 지정했습니다. 그 당시에는 size_t그러한 제약을 실질적으로 구현했습니다. 그러나 C ++ 11에서는 기본적으로 기본적으로 다음과 같이 정의 std::make_unsigned<X::difference_type>::type됩니다. 실제로는 아마도 동일하거나 size_t.
Evan Teran 2015

2
CARE 정답이 잘못되었습니다 .... stackoverflow.com/questions/4849678/… 참조 TL : DR : 할당 자 size_type은 size_t 여야하며 C ++ 17에서는 size_type이 그대로 사용되지 않습니다.
user3063349 jul.

1
@ user3063349 해당 페이지 나 C ++ 2017 Standard (23.10.8)에는 size_type지원 중단 을 암시하는 내용이 없습니다 . 무엇을 제공합니까?
Marc.2377

42
  • size_t객체의 크기에 사용되는 유형으로 정의되며 플랫폼에 따라 다릅니다 .
  • container::size_type컨테이너의 요소 수에 사용되는 유형이며 컨테이너에 따라 다릅니다 .

모든 std컨테이너는 size_t으로 사용 size_type되지만 각 독립 라이브러리 공급 업체는 해당 컨테이너에 적합한 유형을 선택합니다.

당신이 보면 , size_typeQt 컨테이너가 버전에 따라 다르다는 것을 알 수 있습니다. Qt3에서는 였고 unsigned intQt4에서는 int.


1
int로 표현 된 무언가의 크기를 갖는 것이 약간 이상하다는 것을 알았습니다. 컨테이너에 대해 음수 크기를 가질 수 있습니까?
Mihai Todor

10
@MihaiTodor : 사람들이 모든 것에 대해 서명 된 유형을 사용하는 것은 드문 일이 아닙니다. Qt가이를 따르는 것 같습니다. 그 이유는 혼합 작업 (특히 비교)은 많은 사람들이 혼합 작업을 처리 및 / 또는 피해야하는 것보다 숫자에 서명되지 않은 유형을 사용하는 것을 피하는 재난 영역이기 때문입니다. 서명되지 않은 유형의 음수를 표현할 수 없다해서, 당신은 의미하지 않는다 음수가 될 수 없습니다 숫자를 사용 :-) 나는 그것의 놀랍 고백 int이 아니라 ssize_t, int작은의 종류이다.
Steve Jessop

2
"모든 표준 컨테이너는 size_t를 size_type으로 사용합니다."매우 거짓이며 오해의 소지가 있습니다. 예, 그들은 일반적으로 수행합니다 (적어도 모든 컴파일러가 그렇게했습니다).하지만 C ++ 언어 참조에는 모든 stl 컨테이너에 대해 유사해야한다고 명시되어 있지 않습니다! so care
user3063349 jul.


8

들면 std::[w]string, std::[w]string::size_type동일한에 std::allocator<T>::size_type상기와 동일하다 std::size_t. 다른 컨테이너의 경우 일부 구현 정의 부호없는 정수 유형입니다.

때로는 정확한 유형을 갖는 것이 유용합니다. 예를 들어 유형이 (like, to UINT_MAX)로 둘러싸 이는 위치를 알고 있으므로 사용할 수 있습니다. 또는 실제로 함수 / 클래스 템플릿에 두 개의 동일한 유형을 전달해야하는 템플릿의 경우.

size_t어쨌든 간결하거나 반복자를 사용 하는 경우가 종종 있습니다. 일반 코드에서는 일반적으로 템플릿이 사용되는 컨테이너 인스턴스와 해당 컨테이너의 크기를 모르기 Container::size_type때문에 컨테이너 크기를 저장해야하는 경우 typedef 를 사용해야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.