1.什么是string类?
在官网中,string类有这样的介绍:
Strings are objects that represent sequences of characters.
即:string类表示的对象是字符串类。
1. string是表示字符串的字符串类
2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
3. string在底层实际是:basic_string模板类的别名,typedef basic_string string;
4. 不能操作多字节或者变长字符的序列。
(在使用string类时,必须包含#include头文件以及using namespace std;)
2.string类对象的常见构造
2.1 无参默认构造;
在官网中,对string();的解释为:
Constructs an empty string, with a length of zero characters.
即:构造一个空字符串,长度为零字符。
int main() { //string();定义一个空的string类 string s1; return 0; }
2.2 通过字符串常量初始化;
在官网中,对于string (const char* s);的解释为:
Copies the null-terminated character sequence (C-string) pointed by s.
即:复制s指向的以空字符结尾的字符串。
int main() { //string (const char* s);复制s指向的以空字符结尾的字符串 string s2("hello world!"); return 0; }
2.3 拷贝构造;
在官网中,对string (const string& str);的解释为:
Constructs a copy of str.
即可以理解为拷贝构造。
int main() { //拷贝构造s2 string s3(s2); string s4 = s2; return 0; }
2.4通过字符串子串初始化 ;
在官网中,对string (const string& str, size_t pos, size_t len = npos);的解释为:
Copies the portion of str that begins at the character position pos and spans len characters.
即:拷贝str从pos位置到len个字符的一部分。
int main() { //string (const string& str, size_t pos, size_t len = npos); //拷贝str从pos位置到len个字符的一部分。 string s5(s2, 1, 7); return 0; }
可在官网里括号里还有一句话: (or until the end of str, if either str is too short or if len is string::npos).
这句话可以理解为:如果str太短或者len太长,那就只拷贝到str的结尾。
2.5通过字符串前n个字符初始化;
在官网中,对string (const char* s, size_t n);的解释为:
Copies the first n characters from the array of characters pointed by s.
即:拷贝s指向的字符数组的前n个字符。
int main() { //string (const char* s, size_t n); //拷贝s指向的字符数组的前n个字符 string s6("hello world!", 5); return 0; }
2.6 用n个字符c初始化字符串;
在官网中,对string (size_t n, char c);的解释为:
Fills the string with n consecutive copies of character c.
即:用n个C语言字符填充。
int main() { //string (size_t n, char c); //用n个C语言字符填充 string s7(10, 'l'); }
2.7 验证:
<<与>>已实现重载,所以可以直接用。
故验证代码如下:
#include<iostream> #include<string> using namespace std; int main() { //string();定义一个空的string类 string s1; //string (const char* s);复制s指向的以空字符结尾的字符串 string s2("hello world!"); //string (const string& str);拷贝构造s2 string s3(s2); string s3_1 = s2; //string (const string& str, size_t pos, size_t len = npos); //拷贝str从pos位置到len个字符的一部分。 string s4(s2, 1, 7);//拷贝s2从下标1位置开始到7个字符的一部分 //string (const char* s, size_t n); //拷贝s指向的字符数组的前n个字符 string s5("hello world!", 5);//拷贝"hello world!"的前5个字符 //string (size_t n, char c); //用n个C语言字符填充 string s6(10, 'l');//拷贝10个‘l’ cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; cout << s3_1 << endl; cout << s4 << endl; cout << s5 << endl; cout << s6 << endl; return 0; }
结果如图:
3.string类对象的遍历及访问
3.1 下标+ [] 访问
①计算string类的长度或大小
(size与length意义相同,建议用size)用法如下:
int main() { string s1("hello world!"); cout << s1.size() << endl; cout << s1.length() << endl; return 0; }
(由结果得知,size与length不包含'\0')
② 知道了string的长度,我们就可以这样遍历string:
int main() { string s1("hello world!"); for (size_t i = 0; i < s1.size(); i++) { cout << s1[i] << endl;//重载了s1.operator[](i) } return 0; }
③实现逆置string
方法一:手搓交换
int main() { string s1("hello world!"); cout << "逆置前s1="<< s1 << endl; size_t begin = 0;//左边界 size_t end = s1.size() - 1;//右边界 while (begin < end) { char tmp = s1[begin]; s1[begin] = s1[end]; s1[end] = tmp; ++begin; --end; } cout << "逆置后s1=" << s1 << endl; return 0; }
方法二:使用swap
int main() { string s1("hello world!"); cout << "逆置前s1="<< s1 << endl; while (begin < end) { swap(s1[begin], s1[end]); ++begin; --end; } cout << "逆置后s1=" << s1 << endl; return 0; }
3.2 iterator迭代器访问
int main() { string s1("hello world!"); string::iterator it = s1.begin(); while (it != s1.end()) { cout << *it << endl; ++it; } return 0; }
iterator的用法与指针类似:
二者的区别:
下标+[]只适用于部分容器,底层物理有一定连续,如链式结构、树形、哈希结构,就只能用迭代器。迭代器才是容器访问的主流形式。
3.3 at访问
at访问与下标+[]访问的功能相同,区别主要体现在越界访问时的报错形式:
如①下标+[]的越界访问:
int main() { string s1("hello world!"); cout << s1[20] << endl; return 0; }
②at的越界访问:
int main() { string s1("hello world!"); cout << s1.at(20) << endl; return 0; }
(即下标+[]是暴力地终止,at是温柔地终止)