Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
STL5 / lab2-string / lab2-string.doc
Скачиваний:
9
Добавлен:
10.04.2015
Размер:
177.66 Кб
Скачать

Итераторы

Класс 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))

{

}

Соседние файлы в папке lab2-string