前言
本篇文章针对C++中的string做一些详细的介绍和学习,并且会包含一些关于STL的介绍
注意:
本篇文章只包含基础知识
STL
STL是标准模板库的一个缩写,全称是Standard Template Library
string
C++中定义了一种类,为string,存放在头文件<string>中
存放C语言风格字符串的头文件是<cstring>,也就是以’\0’为结尾的字符数组
C语言的字符串的对比与string
指针与类
char*是指针,而string是一个类
在string中封装了char*,管理这个字符串,是一个char*类型的容器
功能的多少
string封装了很多实用的成员方法
比如:查找find、拷贝copy、删除erase、替换replace、插入insert
不用考虑内存释放和越界
string管理char*对所分配的内存,每一次string的复制/赋值,取值都由string类负责维护,不用担心复制越界和取值越界等问题。
API
API是应用程序接口(Application Programming
Interface),是STL提供给用户使用的接口,一般表现为公共成员函数和重载操作符
string的十个API(功能)
构造
下面介绍构造的四种用法
string(); //默认构造函数,作用是创建一个空的字符串 string(const string& str); //拷贝构造函数,使用一个string对象初始化另一个string对象 string(const char* s); //含参构造函数,使用C语言风格字符串初始化 string(int n, char c); //含参构造函数,使用n个字符C初始化
赋值
重载赋值操作符=
string& operator=(const char* s); //C风格的字符串赋值给当前的字符串 string& operator= (const string& s); //把字符串s赋给当前的字符串 string& operator=(const char c); //字符串赋值给当前的字符串
成员函数assign
string& assign(const char* s); //C风格字符串赋值给当前的字符串 string& assign(const char* s.int n); //把C风格的字符串s的前n个字符赋给当前的字符串 string& assign(const string& s); //把字符串s赋给当前字符串 string& assign(int n, char c); //把n个字符c赋给当前的字符串 string& assign(const string& s, int start, int n); //将字符串s中从start开始的n个字符赋值给当前的字符串
存取
string& assign(const char* s); //C风格字符串赋值给当前的字符串 string& assign(const char* s.int n); //把C风格的字符串s的前n个字符赋给当前的字符串 string& assign(const string& s); //把字符串s赋给当前字符串 string& assign(int n, char c); //把n个字符c赋给当前的字符串 string& assign(const string& s, int start, int n); //将字符串s中从start开始的n个字符赋值给当前的字符串
重载下表获取操作符[]
char& operator[](int n); //通过[]以访问下标的方式获取字符
注意:
当使用下标操作符获取字符时,如果下标越界,程序将会强制终止
成员函数at
char& at(int n); //通过at方式获取字符
注意:
使用at方法获取字符时,如果下标越界,at方法内部会抛出异常,可以使用try-catch捕获并处理该异常
需要包含头文件<stdexception>
拼接
重载复合操作符+=
string & operator+=(const string% str); //将字符串str追加到当前字符串末尾 string& operator+=(const char* str); //将C风格字符数组追加到当前字符串末尾 string& operator+=(const char c); //将字符c追加到当前字符串末尾
成员函数append
string& append(const char* s); //把C风格字符数组s连接到当前字符串结尾 string& append(const char* s, int n); //把C风格字符数组s的前n个字符连接到当前字符串结尾 string& append(const string& s); //将字符串s追加到当前字符串末尾 string& append(const string& s, int pos, int n); //把字符串s中从pos开始的n个字符连接到当前字符串结尾 string% append(int n, char c); //在当前字符串结尾添加n个字符c
查找
成员函数find
int find(const string& str, int pos = 0)const; //查找str在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0 int find(const char* s, int n = 0)const; //查找C风格字符串s在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0
详细解释:
当查找失败时,find方法返回 - 1, - 1已经被封装为string的静态成员常量string::npos
static const size_t npos = -1;
find方法通常查找字符串第一次出现的位置,而rfind2方法通常查找字符串最后一次出现的位置
成员函数rfind
这里可以联系上面的find函数帮助理解
int rfind(const string& str, int pos = npos)const; //从pos开始向左查找最后一次出现的位置,pos默认是npos int rfind(const char* s, int pos = npos)const; //查找s最后一次出现的位置,从pos开始向左查找,pos默认为npos int rfind(const char* s, int pos, int n)const; //从pos开始想做查找s的前n个 字符最后一次出现的位置 int rfind(const char c, int pos = npos)const; //查找字符c最后一次出现的位置
注意:
rfind(str, pos)的实际的开始位置是pos + str.size(),即从该位置开始(不包含该位置字符)向前寻找匹配项,
如果有则返回字符串位置,如果没有则返回string::npos
关于string::npos
我们都知道 - 1 是size_t类的最大值,
所以string::npos其实就表示“直到字符串结束”,这样就可以理解rfind中pos的默认参数是npos了
同时,我们也可以发现string::npos和container.end()迭代器(没学过)其实是相同含义的,说明我们STL各个模块的设计是统一的
替换
成员函数replace
string & replace(int pos, int n, const string & str); //替换从pos开始n个字符为字符串s string& replace(int pos, int n, const char* s); //替换从pos开始的n个字符为字符串s string& replace(int pos, int n, const char* s); //替换从pos开始的n个字符为字符串s
成员函数compare
int compare(const string& s)constl //与字符串s比较 int compare(const char* s)const; //与C风格字符数组比较
注意:
compare函数依据字典序(即字母顺序)进行比较
当当前字符串小于给定字符串时,返回 - 1、当当前字符串比给定字符串大时,返回1、相等返回0
重载比较操作符
有 > < >= <= == !=
子串
成员函数substr
string substr(int pos = 0; int n = npos)const; //返回由pos开始的n个字符组成的字符串
解释:
string::npos的含义是截取到整个字符串结束
插入
成员函数insert
string& insert(int pos, const char* s); //在pos位置插入C风格字符数组 string& insert(int pos, const string& str); //在pos位置插入字符串str string& insert(int pos, int n, char c); //在pos位置插入n个字符c
删除
成员函数erase
string& erase(int pos, int n = npos); //删除从pos位置开始的n个字符
解释:
string::npos的含义是截取到整个字符串结束
结语
本篇文章只介绍了string的使用知识
至于相关的例题,则会在之后其他的专栏里记录和总结