Итераторы
Класс stringкак и классvectorподдерживает доступ к элементам с помощью итераторов:
template <class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> >
class std::basic_string
{
public:
// итераторы для перечисления элементов строки в прямом порядке
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
// итераторы для перечисления элементов строки в обратном порядке
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;
//….
}
Перечисленные методы полностью соответствуют методам класса вектор. Итератора stringтакже являются итераторами произвольного доступа, т.е. они могут участвовать в арифметических выражениях, результатом которых является итератор, указывающий на соответствующий элемент. Следует отметить, что итераторы для классаstringне имеют такого важного значения, как для классаvector. Дело в том, что основное применение итераторов – обработка контейнеров с помощью стандартных алгоритмов4, большинство из которых рассматривает отдельные элементы контейнера в качестве обрабатываемой единицы, для строк это не всегда так. Для строк важна именно последовательность символов, так например сортировка содержащихся в строке символов практически не имеет смысла.
Размеры строк
Класс stringимеет следующие методы для работы с размером строки:
template <class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> >
class std::basic_string
{
public:
size_type size() const;
size_type length() const;
size_type max_size() const;
void resize(size_type n, Ch c);
void resize(size_type n);
size_type capacity() const;
size_type reserve(size_type res = 0);
void clean();
bool empty() const;
};
В основном методы аналогичны методам класса vector, рассмотрим отличия:
length() – возвращает длину строку с символах, фактически является синонимомsize();
clean() – удаление всех символов строки
resize(size_typen,Chc) – изменяет длину строки, если новая длинна меньше старой, то лишние символы удаляются из строки, если больше то в конец строки добавляются символы определяемые вторым параметром.
resize(size_typen) – выполняет действие аналогичноеresize(n,Ch()), т.е. в качестве дополняемых символов берется значение символа по умолчанию, для обычных символов это 0.
Понятие емкости строки аналогично понятию емкости вектора, единственное отличие заключается в том, что в случае строки стандарт никак не оговаривает каким образом строка хранит свои символы, в отличие от вектора, где стандарт гарантирует, что данные хранятся в одном последовательном фрагменте памяти.
Сравнение строк
Класс stringподдерживает сравнение с другими строками и С-строками.
template <class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> >
class std::basic_string
{
public:
// сравнение с другой строкой
int compare(const basic_string& str) const;
// сравнение подстроки начинающейся с pos1 длинной n1 со строкой str
int compare(size_type pos1, size_type n1,
const basic_string& str) const;
// сравнение подстроки начинающейся с pos1 длинной n1
// с подстрокой строкой str начинающейся с pos2 длинной n2
int compare(size_type pos1, size_type n1,
const basic_string& str, size_type pos2, size_type n2) const;
// сравнение с С-строкой
int compare(const Ch* s) const;
// сравнение строки с символами содержащимися в массиве s
// длинной n2
int compare(size_type pos1, size_type n1,
const Ch* s, size_type n2) const;
};
Функции сравнения возвращает 0 если строки равны, отрицательное число, если строка меньше чем строка задаваемая str, положительное число в противном случае. Сравнение строк осуществляется в лексикографическом смысле5.
string s1(“aaa”);
const char* str = “aab”;
s1.compare(str); // результат сравнения отрицательный
string s2 = “!string!”;
string s3 = “this is string”;
s2.compare(1,6,s3,8,6); // результат равнения 0
Для basic_stringвведены операторы сравнения ==, !=, >, <, >=, <= принимающие в качестве параметровstringи С-строки. Таким образом строки можно сравнивать следующим образом:
string s1,s2,s3;
…// Инициализировать s1,s2,s3
if ((s1 == s2)
|| (s2 > “Right argument C-string”)
|| (“Left argument C-string” <= S3))
{
…
}