без знака int и size_t для строки.длина()

#c #string #string-length #size-t

Вопрос:

Как правильно использовать str.length() в cpp?

 string s = "Hello";
int length = s.length();
 

или

 string s = "Hello";
unsigned int length = s.length();
 

или

 string s = "Hello";
unsigned int length = static_cast<unsigned int>(s.length());
 

Комментарии:

1. auto length = s.length(); ? Вы упоминаете size_t в названии, но ни в одном из ваших примеров это не используется, почему?

2. Каким-то образом, даже несмотря на то, что это упоминается в вашем названии, ни один из ваших вариантов на самом деле не используется size_t .

3. std::size_t length = s.length(); . Или еще лучше, std::size_t size = s.size(); для согласованности с другими контейнерами.

4. Зависит от того, что вы с этим делаете и какие предположения хотите сделать. Знаете ли вы, что размер всегда будет соответствовать int операционной unsigned ? Вы собираетесь выполнять какую-то арифметику со знаком или сравнивать с ней?

5. auto length = s.length(); или size_t length = s.length(); это то, что я предпочитаю , но если у вас нет строки длиной, превышающей максимальное значение int , все эти предупреждения в порядке.

Ответ №1:

Чтобы быть педантичным, я бы рекомендовал вам использовать std::string::size_type . Таким образом, вы не сможете ошибиться:

 std::string s = "Hello";
std::string::size_type length = s.length();
 

Вы можете присвоить ему псевдоним более короткого типа для краткости, если хотите:

 using str_size = std::string::size_type;

std::string s = "Hello";
str_size length = s.length();
 

Конечно, вы часто можете позволить компилятору определить правильный тип для вас с помощью auto :

 std::string s = "Hello";
auto length = s.length();
 

Ответ №2:

В c std::string классе есть .size() метод , который возвращает значение типа size_t (во всяком случае, по умолчанию. Для лучшего понимания того, почему этот тип .size() возвращается по умолчанию, см. Комментарий @bitmask ниже), который используется для представления размеров (как следует из его названия). Поэтому, учитывая это, ваш код должен выглядеть примерно так

 std::string s("hello world!");
size_t string_length = s.size();
 

Комментарии:

1. Технически, std::string::size() возвращает a size_type , который имеет псевдоним для своего распределителя size_type , который, в свою очередь, для Распределителя по умолчанию std::string , а именно std::allocator , тогда std::size_t .

2. @bitmask благодарим вас за разработку. Я сошлюсь на ваш комментарий в своем ответе