了解
- string是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作
- string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;
- 不能操作多字节或者变长字符的序列
在使用string类时,必须包含#include头文件以及using namespace std;
操作:
构造
- 空字符串:string()
- 用字符串构造:string(const char* s)
- 构造n个字符c:string(size_t n,char c)
- 拷贝构造:string(const string& s)
容量相关
- size:返回字符串有效字符长度
- length:返回字符串有效字符长度
- capacity:返回空间总大小
- empty:检测字符串是否为空串,是返回true,否则返回false
- clear:清空有效字符
- reserve:为字符串预留空间
- resize:将有效字符的个数改成n,多出的空间用c填充
size()与length()方法底层实现原理完全相同,引入size()是为了与其他容器的接口保持一致,一般情况下基本都是用size()
clear()只是将string中有效字符清空,不改变底层空间大小
resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于
string的底层空间总大小时,reserver不会改变容量大小。
遍历、访问
- operator[]:直接访问一位置的字符
- begin+ end:begin获取一个字符的迭代器/end获取最后一个字符下一个位置的迭代器
- rbegin + rend:begin获取一个字符的迭代器/end获取最后一个字符下一个位置的迭代器
- 范围for:C++11支持的范围for新遍历方式
//三种遍历方式
void TestString()
{
string s("Hello world");
//1
string::iterator it=s.begin();
while(it!=s.end())
{
cout<<*it<<" ";
++it;
}
cout<<endl;
string::reverse_iterator rit=s.rbegin();
while(rit!=s.rend())
{
cout<<*rit<<" ";
--rit;
}
cout<<endl;
//2
for(auto c:s)
cout<<c<<" ";
cout<<endl;
}
//3
for(size_t i=0;i<s.size();i++)
cout<<s[i]<<" ";
cout<<endl;
修改
- push_back(’ '):在字符串后尾插字符c
- append(" "):在字符串后追加一个字符串
- operator+=:在字符串后追加字符串str或字符
- c_str:返回C格式字符串
- find+pos (字符/字符串,pos):从字符串pos位置开始往后找字符,返回该字符的位置
- rfind:从字符串pos位置开始往前找字符c,返回该字符的位置
- substr:在str中从pos位置开始,截取n个字符,然后将其返回
非成员函数
- operator+:【传值返回,深拷贝效率低】
- operator>>:输入运算符重载
- operator<<:输出运算符重载
- getline:获取一行字符串
- relational operators:大小比较
模拟实现string类
对于实现一个类,主要是实现构造函数、拷贝构造函数、赋值运算符的重载、析构函数
class String
{
public:
String(const char* str="")
{
//如果传一个空指针,程序非法,需要进行断言
if(nullptr==str)