program tip

int 대신 string :: size_type

radiobox 2020. 12. 11. 08:01
반응형

int 대신 string :: size_type


const std::string::size_type cols = greeting.size() + pad * 2 + 2;

string::size_type? int작동해야합니다! 그것은 숫자를 보유하고 있습니다 !!!


짧은 숫자도 보유합니다. 서명 된 문자도 마찬가지입니다.

그러나 이러한 유형 중 어느 것도 문자열 의 크기를 나타낼만큼 충분히 크지 않을 있습니다.

string::size_type그것을 보장합니다. 그 문자열이 아무리 크더라도 문자열의 크기를 나타낼만큼 충분히 큰 유형입니다.

이것이 필요한 이유에 대한 간단한 예를 들어 64 비트 플랫폼을 고려하십시오. int는 일반적으로 여전히 32 비트이지만 2 ^ 32 바이트 이상의 메모리를 가지고 있습니다.

따라서 (서명 된) 정수가 사용 된 경우 2 ^ 31 자보다 큰 문자열을 만들 수 없습니다. size_type은 이러한 플랫폼에서 64 비트 값이므로 문제없이 더 큰 문자열을 나타낼 수 있습니다.


당신이 준 예,

const std::string::size_type cols = greeting.size() + pad * 2 + 2;

Koenig의 Accelerated C ++ 에서 가져온 것 입니다. 그는 또한 그 직후에 자신이 선택한 이유를 다음과 같이 말합니다.

std :: string 유형은 size_type을 문자열의 문자 수를 보유하는 데 적합한 유형의 이름으로 정의합니다. 문자열의 크기를 포함하기 위해 지역 변수가 필요할 때마다 해당 변수의 유형으로 std :: string :: size_type을 사용해야합니다.

우리가 cols에 std :: string :: size_type 유형을 부여한 이유는 cols가 인사말의 문자 수를 포함 할 수 있는지 확인하기 위해서입니다. cols에 int 유형이 있다고 간단히 말할 수 있으며 실제로 그렇게하면 작동 할 것입니다. 그러나 cols의 값은 프로그램에 대한 입력의 크기에 따라 다르며 해당 입력의 길이를 제어 할 수 없습니다. 누군가가 우리 프로그램에 너무 긴 문자열을 주어 int가 그것의 길이를 포함하기에 충분하지 않을 수 있다고 생각할 수 있습니다.


중첩 된 size_typetypedef는 STL 호환 컨테이너에 대한 요구 사항 std::string이므로 일반 코드는 크기를 나타내는 올바른 정수 유형을 선택할 수 있습니다.

응용 프로그램 코드에서 사용할 필요 가 없습니다. a size_t는 완전히 괜찮습니다 ( int그렇지 않습니다. 서명이되어 있고 서명 / 부호없는 비교 경고가 표시되기 때문입니다).

참고 URL : https://stackoverflow.com/questions/1181079/stringsize-type-instead-of-int

반응형