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_type
typedef는 STL 호환 컨테이너에 대한 요구 사항 std::string
이므로 일반 코드는 크기를 나타내는 올바른 정수 유형을 선택할 수 있습니다.
응용 프로그램 코드에서 사용할 필요 가 없습니다. a size_t
는 완전히 괜찮습니다 ( int
그렇지 않습니다. 서명이되어 있고 서명 / 부호없는 비교 경고가 표시되기 때문입니다).
참고 URL : https://stackoverflow.com/questions/1181079/stringsize-type-instead-of-int
'program tip' 카테고리의 다른 글
C ++ 정적 초기화 순서 문제 찾기 (0) | 2020.12.11 |
---|---|
SQL Server에서 시간을 어떻게 비교할 수 있습니까? (0) | 2020.12.11 |
SQLite“INSERT OR REPLACE INTO”vs.“UPDATE… WHERE” (0) | 2020.12.11 |
printf ()를 사용하는 소수점 두 자리 (0) | 2020.12.11 |
Ruby on Rails에서 has_many 항목 수를 확인합니다. (0) | 2020.12.11 |