Создание и инициализация string
Класс stringподдерживает следующие конструкторы и методы инициализации строк:
template <class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> >
class std::basic_string
{
public:
explicit basic_string(const A& a = A());
basic_string(const basic_string& s, size_type pos = 0,
size_type n = npos, const A& a = A());
basic_string(const Ch* p, size_type n, const A& a = A());
basic_string(const Ch* p, const A& a = A());
basic_string(size_type n, Ch c, const A& a = A());
template<class In>
basic_string(In begin, In end, const A& a = A());
~basic_string(, const A& a = A());
static const size_type npos;
};
Таким образом, строку можно инициализировать другой строкой, подстрокой строки, С-строкой, массивом символов, последовательностью одинаковых символов, или последовательность символов перечисляемых итераторами. Определена специальная константу npos, которая обозначает максимально возможное количество символов, однако ее можно использовать только если в качестве инициализатора используетсяstring
// пустая строка
string s1;
// строка инициализированная С строкой
string s2(“Simple C-string”);
// строка инициализированная массивом символов
char char_array[] = {‘C’,’h’,’a’,’r’,’a’,’c’,’t’,’e’,’r’,
’ ’,’a’,’r’,’r’,’a’,’y’};
// используя весь массив
string s3(char_array,15);
// используя часть массива
string s4(char_array+10,3); // s4 содержит «arr»
// Строка инициализируется другой строкой
string s5(s2);
// Подстрокой
string s6(s2,1,4); // s6 содержит “impl”
string s7(s2,7,npos); // s7 содержит “C-string”, в данном случае
// npos используется для, чтобы указать все символы
// начиная с 7-ого
// Строка инициализируется копиями символа
string s8(10,”A”); // s8 содержит “AAAAAAAAAA”
string s9(1,”B”); // s8 содержит “B”
// Инициализация строки послед символов заданной с помощью итераторов
vector<chat> vec;
vec.bush_back(‘H’);
vec.bush_back(‘e’);
vec.bush_back(‘l’);
vec.bush_back(‘l’);
vec.bush_back(‘o’);
string s10(vec.begin(),vec.end()); // s10 содержит “Hello”
Помимо конструкторов определены следующие операции присваивания и методы инициализации строк:
template <class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> >
class std::basic_string
{
public:
basic_string& operator=(const basic_string& str);
basic_string& operator=(const Ch* p);
basic_string& operator=(Ch c);
basic_string& assign(const basic_string& str);
basic_string& assign(const basic_string& str, size_type pos,
size_type n);
basic_string& assign(const Ch* p);
basic_string& assign(const Ch* p, size_type n);
basic_string& assign(size_type n, Ch c);
template<class In>
basic_string& assign(In begin, in end);
}
Методы полностью аналогичны приведенным выше версиям конструкторов, за исключением разве что возможно присвоить строке отдельный символ.
Обращение к элементам строки
Обращение к элементам строки может быть осуществлено с помощью следующих методов:
template <class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> >
class std::basic_string
{
public:
// доступ без проверки диапазона
reference operator[] (size_type n);
const_reference operator[] (size_type n) const;
// доступ с проверкой диапазона индекса
reference at (size_type n);
const_reference at (size_type n) const;
}
Методы полностью аналогичны метода класса vector.operator[] не проверяет правильность индекса при обращении к символу, в то время как функцияat() выполняет такую проверку, в случае выхода за границы диапазона она генерирует исключениеout_of_range.
Важно отметить, что stringможет содержать внутри себя символ с кодом 0, который в данном случаене является маркером окончания строки. Это особенно необходимо учитывать, преобразуяstringв С-строку (см. секцию «Взаимодействиеstringи С-строк»), так как в этом случае нулевой символ может быть принят функциями обработки С-строк как символ терминатор.