前言
string类虽然不在STL的容器中,但string类十分重要,string类是对字符串的存储和相关操作。
basic_string
std::basic_string类是C++的一个模版类,它支持多种字符类型。
- char :用于表示一个字节的字符,使用ASCII编码。
- wchar_t :用于表示宽字符,可以支持更广泛的字符集。
- char8_t :用于表示8位的Unicode字符(UTF-8)。
- char16_t :用于表示16位的Unicode字符(UTF-16)。
- char32_t :用于表示32位的Unicode字符(UTF-32)。
basic_string 实例化出来的4种类型:
string wstring u16string u32string
string类是basic_string模版类的一个实例,它使用char来实例化basic_string模版类,并使用char_traits和allocator 作为basic_string的默认参数。
一、string类
1、string类是表示字符序列的类。
2、标准的字符串类提供了对此对象的支持,其接口类似于标准字符容器的接口,但是添加了专门用于操作单字节字符字符串的设计特性。
3、string类封装了字符数组,并提供了一系列成员函数来执行字符串的创建、修改、连接、查找、替换等操作。
string类出现实际上是比STL要早的,后来才分入STL库里面;所以,string一开始设计比较冗余,有很多重复功能的接口;我们没必要记住所有的接口,只需将核心接口记住并熟练使用就好啦;(如果遇到陌生的接口,直接查看文档就好了)。
二、string默认成员函数
2.1、构造函数
先来看一下C++库里面string的构造函数。
1、string();
这是没有参数的构造函数(也就是默认构造函数),就是在创建string类对象时不需要传参数。
#include<iostream> #include<string> using namespace std; void test() { string s1; } int main() { test(); return 0; }
2、string(const char* s);
在创建string类对象时,传字符串(指针/字符数组),进行类对象的初始化。
使用:用字符串来初始化对象。
void test() { string s1; //string(); string s2("I Love You"); //string(const char* s); }
3、string(const char* s, size_t n);
与上面的构造函数不同的时,在传字符串指针的时,多一个参数n。
使用:用字符数组的前n个字符来初始化string类对象。
void test() { string s1; //string(); string s2("I Love You"); //string(const char* s); string s3("I Love You", 6); //string(const char* s, size_t n); }
可以通过调试来看对象s1,s2,s3的值
4、string(const string& str);
在创建string类对象,传同为string类类型的对象进行对象的初始化(也就是拷贝构造函数)。
使用:通过同类型的对象来初始化;
void test() { string s1; //string(); string s2("I Love You"); //string(const char* s); string s3("I Love You", 6); //string(const char* s, size_t n); string s4(s2); // string(const string& str); }
5、string(const string& str, size_t pos, size_t len=npos);
与拷贝构造不同的时,这个构造函数,还需要多传两个参数pos和len;
使用:用str中的第pos个位置后面len个字符进行初始化对象。
void test() { string s1; //string(); string s2("I Love You"); //string(const char* s); string s3("I Love You", 6); //string(const char* s, size_t n); string s4(s2); // string(const string& str); string s5(s2, 2, 4); //string(const string& str, size_t pos, size_t len=npos); }
6、string(size_t n, char ch);
创建string类对象,并将其内容设置成n个ch。
void test() { string s1; //string(); string s2("I Love You"); //string(const char* s); string s3("I Love You", 6); //string(const char* s, size_t n); string s4(s2); // string(const string& str); string s5(s2, 2, 4); //string(const string& str, size_t pos, size_t len=npos); string s6(6, 'H'); //string(size_t n, char ch); }
7、
C++文档中最后一个构造函数,涉及到迭代器,这里先不介绍,后面再使用。
2.2、析构函数
析构函数没有函数重载,就不过多叙述。
2.3、赋值运算符重载
1、string& operator= (const string& str);
使用:这个就是对于两个已经存在的string类类型对象,进行赋值操作。
void test1() { string s1; string s2("Hello World");//拷贝构造 s1 = s2;//赋值运算符重载 }
2、string& operator= (const char* s);
使用:将一个字符串赋值给一个已经存在的string类类型对象。
void test1() { string s1; string s2("Hello World");//拷贝构造 s1 = s2;//赋值运算符重载 string s3; s3 = "I Love ";//operator= (const char* s); }
3、string& operator= (char ch);
使用:将一个字符赋值给一个已经存在的string类类型对象。
void test1() { string s1; string s2("Hello World");//拷贝构造 s1 = s2;//赋值运算符重载 string s3; s3 = "I Love ";//operator= (const char* s); string s4; s4 = 'c';//operator= (char ch); }
调试看一下赋值结果:
三、string其他成员函数
3.1、Capacity
这里就看几个常用的(size、lengh、resize、capacity、clear和empty)。
1、size*
size就是返回string对象中的字符(数据)个数(也就是字符串的长度)。
2、lengh
lengh和size一样,都是计算string对象中字符串的长度。
3、resize*
resize是设置string对象中字符串的内容,(如果n要小于size就将字符串数据个数设为n)如果n大于size,(空间不够就扩容)设置size后面的字符内容。如果给了参数c就设置成 c;如果没有给参数c,就默认设置成'\0'。
4、capacity*
capacity 返回string对象中可用空间的大小(就像动态顺序表中capacity一样)。
5、clear*
clear是清理string中字符串的内容,让string对象中字符串变为空,并修改对象中size的值。
6、empty*
empty判断string对象是否为空;为空就返回true,否则返回false。
7、reserve*
reserve是设置string的空间大小,如果传参n比capacity大就扩容;如果小,不一定会缩小容量。
void test2() { string s1("I Love You !!!"); //size 返回s1中字符串数据个数 cout << "size = " << s1.size() << endl; //lengh 返回s1中字符串长度 cout << "lengh = " << s1.length() << endl; //capacity 返回s1中可用空间大小 cout << "capacity = " << s1.capacity() << endl; //设置s1中数据个数 s1.resize(10); cout << s1 << endl; s1.resize(20, 'x'); cout << s1 << endl; //清理s1中字符串内容,使其变成空 s1.clear(); cout << s1 << endl; //empty 判断s1中字符串是否为空 cout << s1.empty() << endl; }
3.2、Element access 数据访问
Element access 就是元素访问,(访问字符串中的数据)。
这里就主要看 operator[] 和at;
除了这样访问元素,还可以通过迭代器就行访问(下面在迭代器内容进行使用)。
1、operator[] *
operator[] 库里面实现了两个,一个用于普通对象的元素访问(可读可写),另一个就用于const修饰的对象的元素访问(只读)。
有了operator[] 这个运算符重载的函数,我们就可以像访问字符数组那样去通过下标访问string类型对象。
2、at
at这个函数是传递一个参数pos,获得string对象中字符串下标为pos的字符。(使用起来和operator[]一样)。
void test3() { string s1("Hello world"); for (int i = 0; i < s1.size(); i++) { s1[i]++; //普通对象调用char& operator[](size_t pos); 可以进行修改 cout << s1[i] << " "; } cout << endl; const string s2("Hello World"); for (int i = 0; i < s2.size(); i++) { //s2[i]++; //err //const修饰的对象调用const char& operator[](size_t pos) cosnt; 不能进行修改 cout << s2[i] << " "; } cout << endl << endl; string s3("Hello world"); for (int i = 0; i < s3.size(); i++) { s3.at(i)++; //普通对象调用char& at(size_t pos); 可以进行修改 cout << s3.at(i) << " "; } cout << endl; const string s4("Hello World"); for (int i = 0; i < s4.size(); i++) { //s4.at[i]++; //err //const修饰的对象调用const char& at(size_t pos) cosnt; 不能进行修改 cout << s4.at(i) << " "; } cout << endl; }
3.3、Modifiers
Modifiers ,库里面提供了以下这些函数,对string对象中字符串进行设置(修改)
【C++】 —— string的使用(二)https://developer.aliyun.com/article/1621429