P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件iostream的声明,使用时请自行添加。
文章目录
- 一、标准库里的string类
- 二、string成员操作函数
-
- 构造函数
- [operator =](#operator =)
- 三、迭代器
- [四、 string类对象的容量操作](#四、 string类对象的容量操作)
- 五、string类对象的修改操作
一、标准库里的string类
在使用string类时,必须包含#include头文件以及using namespace std;
- string是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
- 不能操作多字节或者变长字符的序列
string对象会自动忽略开头的空白(即空格、换行等)并从第一个真正的字符开始读入,直到遇到下一处空白。
这时world还在缓冲区,这是再次cin一下就会自动打印剩下的字符。
二、string成员操作函数
构造函数
cpp
//string() 创建一个空的串,其大小和内容为空
string s1;
//string(const char* s); 创建一个字符串类,将其初始化为一串字符,且这串字符不能被改变
string s2("hello world");
//string (const string& str); 将str的内容作为参数来初始化s3,且str不可修改。
string s3(s2);
//string (const string& str, size_t pos, size_t len = npos); 从字符串str的下标为pos的字符开始拷贝npos个到s4里
string s4(s2, 2, 3);
string s5(s2, 5); //从字符串s2的下标为2开始后面的字符全部拷贝到s5拷贝里
//string (const char* s, size_t n); 将字符串的前n个字符初始化给s6
string s6("hello world", 3);
//string (size_t n, char c); 将n个字符a作为参数初始化s7
string s7(3, 'a');
template <class InputIterator>
string(InputIterator first, InputIterator last);
// 模板代码,为了创建一个通用模板方便对于string类对象的初始化
operator =
cpp
//string& operator= (const string& str);
string s1("holle world");
string s2 = s1;
//string& operator= (const char* s);
string s3 = "holle world";
//string& operator= (char c);
s3 = 'x';
注意: 不可以单独用一个字符来初始化, 传递单个字符就相当于是重置了串中的内容,只能使用已经创建好的串来接收。
三、迭代器
迭代器与C语言指针的使用方法相似,但是其本质却有很大的差别。目前的学习阶段暂且可以认为迭代器就是一个指针,指向串中数据的所在位置的下标。
正向迭代器(iterator)
正向迭代器就是以头为起点,尾为结点。
正向迭代器需要用到两个函数:
string::begin和string::end代表字符串的头和尾。
cpp
int main()
{
string s1("holle world");
string::iterator it = s1.begin();
while (it != s1.end())
{
cout << *it;
it++;
}
cout << endl;
return 0;
}
值得注意的是,其中的 begin() 所返回的是第一个数据所在下表位置,而 end() 所返回的并不是最后一个数据的下标,而是最后一个数据的下一个位置的下标,且当传入的数据串为const类型时,无法通过迭代器对其进行修改,仅可读。
反向迭代器(reverse_iterator)
反向迭代器需要另外两个函数
string::rbegin和string::rend表示字符串的为和头
cpp
int main()
{
string s1("holle world");
string::reverse_iterator rit = s1.rbegin();
while (rit != s1.rend())
{
cout << *rit;
rit++;
}
cout << endl;
return 0;
}
范围for
关于打印字符串,除了用迭代器,还可以用范围for。
四、 string类对象的容量操作
size
size函数用来返回当前字符串的有限长度,单位为字节。
用这个函数结合范围for还可以遍历字符串。
length
此函数用来返回当前字符串的有限长度,单位为字节,不统计字符串末尾 "\0"所占长度。
capacity
此函数用来返回字符串的空间总大小。
max_size
此函数主要功能为返回string串可以存放的最大数据个数(数据为 " char "类型)。
上图所展示为32位机器所能创建的最大数据个数。
reserve
此函数的主要功能为扩容,但在不同编译器下的操作限制有所不同,例如在VS下不可以反向扩容,即缩容,但在linux下可以。
resize
此函数的主要功能为改变串的大小,不仅仅影响串的size,也可能会影响capacity。
cpp
string s("hello world");
s.resize(5);
cout << s << endl;
cout << "s.size->" << s.size() << endl << endl;
string s1("hello world");
s1.resize(25, 'x');
cout << s1 << endl;
cout << "s1.size->" << s1.size() << endl << endl;
string s2;
s2.resize(25, 'x');
cout << s2 << endl;
cout << "s2.size->" << s2.size() << endl << endl;
string s3;
s3.resize(25);
cout << s3 << endl;
cout << "s3.size->" << s3.size() << endl << endl;
上图所示,resize会改变串的大小,当改变前串中所储存数据大小大于改变后大小时,仅保留改变后的前几位数据;
当所传参数位 ( 数字 ,字符),resize会将串中的数据置换为所传的 n 个字符,并改变其串的大小,改变后大小为 n 。
当只传递数字时,若原串没有数据,则将其串内数据赋默认值 ' \0 '。
clear
此函数功能为清楚串内数据。
五、string类对象的修改操作
函数名称 | 功能说明 |
---|---|
push_back | 在字符串后尾插字符c |
append | 在字符串后追加一个字符串 |
operator+= | 在字符串后追加字符串 |
find+npos | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 |
rfind | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
substr | 在str中从pos位置开始,截取n个字符,然后将其返回 |