string:: size type zamiast int

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

Dlaczego string::size_type? int ma działać! trzyma numery!!!

Author: billz, 2009-07-25

3 answers

Skrót również zawiera liczby. Podobnie jak podpisane znaki.

Ale żaden z tych typów nie ma gwarancji, że będzie wystarczająco duży, aby reprezentować rozmiary dowolnych ciągów.

string::size_type tylko to gwarantuje. Jest to typ, który jest wystarczająco duży, aby reprezentować rozmiar łańcucha, bez względu na to, jak duży jest ten łańcuch.

Dla prostego przykładu, dlaczego jest to konieczne, rozważ platformy 64-bitowe. Int jest zazwyczaj nadal 32 bit na tych, ale masz znacznie więcej niż 2^32 bajty pamięć.

Więc jeśli użyto (podpisanego) int, nie można utworzyć ciągów większych niż 2^31 znaków. size_type będzie jednak 64-bitową wartością na tych platformach, więc może bez problemu reprezentować większe ciągi znaków.

 86
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-25 03:06:07

Przykład, który podałeś,

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

Jest z Accelerated C++ by Koenig . Podaje również powód swojego wyboru zaraz po tym, a mianowicie:

Typ std:: string definiuje size_type jako nazwę odpowiedni typ do przechowywania liczby znaków w łańcuchu. Ilekroć potrzebujemy lokalnego zmienna aby zawierać rozmiar łańcucha znaków, powinniśmy użyć std::string::size_type jako Typu tej zmiennej.

Powód, dla którego daliśmy cols a type of std:: string:: size_type is aby zapewnić, że cols jest w stanie zawierać liczbę znaków w powitaniu, bez względu na to, jak duża może być ta liczba. Moglibyśmy po prostu powiedział, że cols ma typ int, i rzeczywiście, czyniąc to prawdopodobnie praca. Jednak wartość cols zależy od wielkości wejścia do naszego programu i nie mamy kontroli nad tym, jak długo może to trwać. Można sobie wyobrazić, że ktoś może dać naszemu programowi ciąg tak długi że int jest niewystarczająca, aby pomieścić jego długość.

 22
Author: mihai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-02 12:51:51

Zagnieżdżony size_type typedef jest wymogiem dla kontenerów zgodnych z STL (które std::string tak się składa), więc kod generyczny może wybrać prawidłowy typ integer do reprezentowania rozmiarów.

Nie ma sensu używać go w kodzie aplikacji, a {[2] } jest całkowicie w porządku (int nie jest, ponieważ jest podpisany, a otrzymasz ostrzeżenia porównawcze signed/unsigned).

 7
Author: Marc Mutz - mmutz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-25 08:51:37