auto len = line.size(); //
Поскольку функция size()
возвращает беззнаковый тип, следует напомнить, что выражения, в которых смешаны знаковые и беззнаковые данные, могут дать непредвиденные результаты (см. раздел 2.1.2). Например, если переменная n
типа int
содержит отрицательное значение, то выражение s.size() < n
почти наверняка истинно. Оно возвращает значение true
потому, что отрицательное значение переменной n
преобразуется в большое беззнаковое значение.
Проблем преобразования между беззнаковыми и знаковыми типами можно избежать, если не использовать переменные типа
int
в выражениях, где используется функция size()
.
Класс string
определяет несколько операторов для сравнения строк. Эти операторы сравнивают строки посимвольно. Результат сравнения зависит от регистра символов, символы в верхнем и нижнем регистре отличаются.
Операторы равенства (==
и !=
) проверяют, равны или не равны две строки соответственно. Две строки равны, если у них одинаковая длина и одинаковые символы. Операторы сравнения (<
, >
, <=
, >=
) проверяют, меньше ли одна строка другой, больше, меньше или равна, больше или равна другой. Эти операторы используют ту же стратегию, старшинство символов в алфавитном порядке в зависимости от регистра.
1. Если длина у двух строк разная и если каждый символ более короткой строки совпадает с соответствующим символом более длинной, то короткая строка меньше длинной.
2. Если символы в соответствующих позициях двух строк отличаются, то результат сравнения определяется первым отличающимся символом.
Для примера рассмотрим следующие строки:
string str = "Hello";
string phrase = "Hello World";
string slang = "Hiya";
Согласно правилу 1 строка str
меньше строки phrase
. Согласно правилу 2 строка slang
больше, чем строки str
и phrase
.
Как правило, библиотечные типы столь же просты в применении, как и встроенные. Поэтому большинство библиотечных типов поддерживают присвоение. Строки не являются исключением, один объект класса string
вполне можно присвоить другому.
string st1(10, 'c'), st2; //
st1 = st2; //
//
Результатом сложения двух строк является новая строка, объединяющая содержимое левого операнда, а затем правого. Таким образом, при применении +
) к строкам результатом будет новая строка, символы которой являются копией символов левого операнда, сопровождаемые символами правого операнда. +=
) (см. раздел 1.4.1) добавляет правый операнд к строке слева:
string s1 = "hello, ", s2 = "world\n";
string s3 = s1 + s2; //
s1 += s2; //
Как уже упоминалось в разделе 2.1.2, один тип можно использовать там, где ожидается другой тип, если есть преобразование из данного типа в ожидаемый. Библиотека string
позволяет преобразовывать как символьные, так и строковые литералы (см. раздел 2.1.3) в строки. Поскольку эти литералы можно использовать там, где ожидаются строки, предыдущую программу можно переписать следующим образом:
string s1 = "hello", s2 = "world"; //
string s3 = s1 + ", " + s2 + '\n';
Когда объекты класса string
смешиваются со строковыми или символьными литералами, то по крайней мере один из операндов каждого оператора +
должен иметь тип string
.
string s4 = s1 + ", "; //
string s5 = "hello" + ", "; //
string s6 = s1 + ", " + "world"; //
//
string s7 = "hello" + ", " + s2; //
//
В инициализации переменных s4
и s5
задействовано только по одному оператору, поэтому достаточно просто проверить его корректность. Инициализация переменной s6
может показаться странной, но работает она аналогично объединенным в цепочку операторам ввода или вывода (см. раздел 1.2). Это эквивалентно следующему коду: