При разработке стандарта, наконец, было покончено с «самодеятельностью» фирм-производителей и программистов: стандартная библиотека шаблонов содержит полноценный строковый класс. В стандарте строкам посвящена отдельная глава 21 — настолько востребован этот тип данных в программировании.
Все строковые типы и функции определены в библиотеке <string>, которую мы уже неоднократно упоминали и подключали:
#include <string>
Здесь определяется базовый шаблон basi c_stгing. Так как в С++ два символьных типа, то определены и две специализации базового шаблона:
typedef basic_string <char> string; typedef basic_string <wchar_t> wstring;
Все различия, связанные с типом символов, собраны в классе-шаблоне свойств символов char_trats<>, который является вторым параметром базового шаблона basic_string. Этот класс свойств включает определения типов и наиболее часто используемые операции с последовательностями символов. Естественно, в библиотеке присутствуют специализации свойств и для обычных символов типа char (см. п. п. 21.1.3.1 в [1]), и для широких символов типа wcha.r_t (см. п. п. 21.1.3.2 в [1]). Стандарт определяет только интерфейсы классов свойств, оставляя реализацию на усмотрение разработчиков компилятора.
Инкапсуляция различий в классе свойств приводит к тому, что пользователь практически не замечает разницы при манипулировании обычными и широкими строками. Единственное различие заключается в объявлении типа строки: stringHwstring. Все операции со строкой совершенно не зависят от типа символов. Базовый шаблон1 выглядит следующим образом:
template <class charT, // тип символов
class traits = char__trai ts<charT>, // класс свойств
class Allocator = allocator<charT> > // распределитель памяти
class basic_string {
public:
// Типы
typedef traits traits_type;
typedef typename traits::char_type value_type:
typedef Allocator allocator_type:
typedef typename Allocator::size_type size_type:
typedef typename Allocator::difference_type difference_type;
typedef typename Allocator::reference reference;
typedef typename Allocator::const_reference const__reference;
typedef typename Allocator: .-pointer pointer;
typedef typename Allocator::const_pointer const_pointer;
typedef typename Allocator::pointer iterator;
typedef typename Allocator: :const__pointer const_iterator; typedef std::reverse_iterator<const_iterator>
const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
static const size_type npos = -1; // Конструкторы и деструктор
explicit basic_string(const Allocators = Allocator()); basic__string (const basic_string<charT, traits, Allocator>&); basic__string(const basic_stringS, size_type, size_type = npos,
const Allocators a = Allocator()); basic_string(const charT*, size__type, const Allocators = Allocator()); basic_string(const charT*, const Allocators = Allocator()); basic_string(size_type, charT, const Allocators = Allocator()); template <class InputIterator>
basic_string(InputIterator, Inputlterator, const Allocators = Allocator());
~basic_string();
// Операция присваивания
basic_stringS operator=(const basic_stringS);
basic_stringS operator=(const charT*);
basic_stringS operator=(charT); // Итераторы
iterator begin();
const_Jterator begin() const;
Именно этот класс послужил основой для разработки класса TString (см. листинг 4.2).
iterator end();
const_iterator end() const;
reverse iterator
rbegin();
const_reverse_iterator rbegin() const;
reverse__i terator rend();
const_reverse_iterator rend() const; // Размеры
size_type size() const;
size_type lengthO const;
size_type max_size() const;
void resize(size_type, charT);
void resize(size_type);
size_type capacityO const;
void reserve(size_type = 0);
bool emptyO const; ?
// Доступ к элементам
const_reference operator[](size_type) const;
reference operator[](size_type);
const__reference at(size_type) const;
reference at(size_type);
// Сцепление строк
basic_string& operator+=(const basic_string&);
basic_string& operator+=(const charT*);
basic_string& operator+=(charT);
basic_string& append(const basic_string&);
basic_string& append(const basic_string&. size_type, size_type); basic_string& append(const charT*, size_type); basic_string& append(const charT*); basic_string& append(size_type, charT); template<class InputIterator> basic_string& append(InputIterator, Inputlterator); // Присваивание строк
basic_string& assign(const basic__string&);
basic_string& assign(const basic_string&, size_type, size_type); basic_string& assign(const charT*, size__type); basic__string& assign(const charT*); basic_string& assign(size_type, charT); template<class InputIterator>
basic_string& assign(InputIterator, Inputlterator); // Модификаторы
basic_string& insert(size_type, const basic_string&);
basic_string& insert(size_type,const basic__string&,size_type,size_type);
basic_string& insert(size_type, const charT*. size_type);
basic_string& insert(size__type, const charT*);
basic__string& i nsert (si ze_type, size_type, charT);
iterator insert(iterator, charT = charTO);
void insert(iterator, size__type, charT);
template<class InputIterator>
void insert(iterator, Inputlterator, Inputlterator); basic_string& erase(size__type = 0, size_type= npos); iterator erase(iterator); iterator erase(iterator, iterator);
basic_string& replace(size_type, size__type, const basic__string&); basic_string& replace(sire_type, size_type, const basic_string&, size_type, size__type);
basic_string& replace(size_type, size_type, const charT*, size_type);
basic_string& replace(size_type, size_type, const charT*);
basic_string& replace(size_type, size_type, size_type, charT);
basic_string& replace(iterator, iterator, const basic_string&);
basic_string& replace(iterator, iterator, const charT*, size_type);
basic_string& replace(iterator, iterator, const charT*);
basic_string& replace(iterator, iterator, size_type, charT);
template<class InputIterator> basic_string& replace(iterator, iterator. Inputlterator, Inputlterator);
size_type copy (charT*, size_type, size__type = 0) const;
void swap(basic_string<charT, traits, AUocator>&); // попучение символьного массива из строки const charT* c_str() const;
const charT* data() const;
const allocator_type& get_allocator() const; // Поиск
size_type find(const basic_string&, size_type = 0) const; size_type find(const charT*, size_type, size_type) const; size_type find(const charT*, size_type = 0) const; size_type find(charT, size_type = 0) const; size_type rfind(const basic_string&, size_type = npos) const; size_type rfind(const charT*, size_type, size_type) const; size_type rfind(const charT*, size_type = npos) const; size_type rfind(charT, size_type = npos) const; size_type find_first_of(const basic_string&, size_type = 0) const; size_type find_first_of(const charT*, size_type, size_type) const; size_type find_first_of(const charT*, size_type = 0) const; size_type find_first_of(charT, size_type = 0) const; size_type find_last_of(const basic_string&, size_type = npos) const; size_type find__last_of(const charT*, size_type, size__type) const; size_type find_last_of(const charT*, size_type = npos) const; size_type find_last_of(charT, size_type = npos) const; size_type find_first__not_of(const basic_string&, size^type = 0) const; size_type find_first_not_of(const charT*,s1ze__type, size^type) const; size_type find_f i rst_not__of (const charT*, size__type = 0) const; size_type find_first_not_of(charT, s1ze_type = 0) const; size_type find_last_not_of(const basic_str1ng&, size_type = npos) const; size_type find_last_not_of(const charT*, s1ze_type, size_type) const; size__type find_last_not_of(const charT*, s1ze_type = npos) const; size_type find_last_not_of(charT, size_type = npos) const; // Выдепение подстроки
basic_string substr(s1ze_type = 0, size_type = npos) const; // Сравнение
int compare(const basic_string&) const;
int compare(size_type, size_type, const basic_string&) const; int compare(size_type, s1ze_type, const basic_string&,
size_type, size_type) const; int compare(size__type, size_type, charT*) const; int compare(charT*) const;
int compare(size_type, size_type, const charT*, size_type) const;
};
Если вам необходим сервер, и необходимо добавлять регулярно ресурсы, тогда вам необходим облачный сервер http://www.smoff.ru.
Назначение методов понятно из названий:
• assign() — присвоить;
• append () — добавить («прицепить»);
• insert () — вставить;
• erase() — удалить;
• replace() — заменить;
• compare() — сравнить;
• find () — искать. |