一、产生
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。所以在C++中就在std域里封装了string类,使得字符串的处理比C语言更加方便,灵活,快捷。在底层string类实际上是basic_string模板类的别名,
typedef basic_string<char, char_traits, allocator> string;
二、常用接口介绍
1.构造函数
string既然是一个类,那么必然就有构造函数,以下是四个常见的构造函数,实际上共有20种。
函数名称 | 功能说明 |
---|---|
string() | 构造空string类,里面存放空字符串 |
string(const char *) | 构造string类,里面存放穿进来的字符串 |
string(size_t n,char ch) | 存放n个ch字符 |
string(const & s) | 拷贝构造空函数 |
#include<iostream>
#include<cstring>//c语言中string库
#include<string>//c++中的string库
using namespace std;
int main()
{
string s1;
string s2("I am a good student");
string s3(5, 'M');
string s4(s2);
cout << s1 << endl
<< s2 << endl
<< s3 << endl
<< s4 << endl;
system("pause");
return 0;
}
2.string的容量操作
函数名称 | 函数说明 |
---|---|
size_t size()const | 求字符串长度 |
size_t length()const | 求字符串长度 |
size_t capacity()const | 求string容量 |
bool empty()const | 判断字符串是否为空串,是返回true,否返回false |
void clear() | 清空字符串 |
void reserve(size_t) | 手动扩容 |
void resize(size_t n ,char ch) | 强制将字符长度改变到n个字节,剩余空间填充字符ch。注意:ch为缺省参数,缺省时为’\0’ |
2.1. szie 和 length
STL库中几乎所有类都有size,为了保持一致性,string也加入了size函数,size和length底层实现是一样的,但是size的出场率更高一些。
2.2.capacity 和 reserve
由此可见,capacity总是为16的倍数-1(长度大于capacity时自动扩容)。
reserve为手动扩容,但扩容规则还是按照默认扩容的规则:扩容后容量大小为16的倍数-1。
2.3 empty 和 clear
empty函数是判断字符串是否为空,为空返回1,否则返回0。
size函数将字串里的内容置为’\0’,并将size置为0,但不动capacity。
2.4 resize
可随意改变字符串的size,扩展的空间用’\0’填入。 注意:若size大于capacity时,调用reserve扩容。
也可将size缩短,截取源字符串size个字节。
3. string类对象的访问操
函数名称 | 函数说明 |
---|---|
char &operator[](size_t pos) | 返回字符串中pos位置的的字符 ,const string 对象调用 |
const char &operator[](size_t pos)const | 返回字符串中pos位置的的字符 ,非const string 对象调用 |
4.string对象内容修改操作
函数名称 | 功能说明 |
---|---|
void push_back(char ch) | 字符串后追加字符ch |
string &append(const char *str) | 字符串后追加一个字符串str |
string &append(const string &str) | 字符串后追加一个对象str |
string &operator +=(const char ch) | 字符串后追加一个字符ch |
string &operator +=(const string &str) | 字符串后追加一个字符串str |
string &operator +=(const string &str) | 字符串后追加一个对象str |
const char *c_str()const | 返回c格式字符串 |
size_t find (char ch, size_t pos = 0) const | 从字符pos位置开始找字符ch,返回该字符的位置 |
size_t rfind (char ch, size_t pos = npos) const | 从字符pos位置开始找字符ch,返回该字符的位置 |
string substr ( size_t pos = 0,size_t n = npos) const | 从字符pos位置开始找字符ch,截断n个字符,返回该字符的位置 |
4.1 push_back
注意:push_back参数列表只能为char型。
4.2 append
注意:append参数列表只能是,char *或string&
4.3 +=的重载
总结:通过前面的对比,在对象字符串追加时,大家都能看到+=的功能包含了push_back和append的功能,而且书写也较便捷,代码易读性高,所以+=的方式更优一些,建议大家也使用这种方式操作。
4.4 c_str
前面我们介绍string是std库中封装的一个便于操作字符串的一个类,既然他是一个类,那他就有成员变量,成员函数。c_str函数就是返回这个对象中的存储字符串的成员变量。既然是这样,那么之前说到的size()函数和capacity()函数和c_str()函数一样,都是返回了这个对象中的存储字符长度和字符容量的成员变量。
4.5 find 、rfind和substr
size_t find(char ch ,size_t pos = 0)
find函数为从pos位置开始往后找字符ch在字符串中的的位置,pos为缺省参数,当不传入时是默认为0,如果在字符串中从pos位置往后找不到字符ch则返回-1
(按%d打印成了INT_MAX
)。
size_t rfind(char ch, size_t pos = npos)
rfind函数为从pos位置开始往前找字符ch在字符串中的的位置,pos为缺省参数,当不传入时是默认为字符串的最后一个位置npos,如果在字符串中从pos位置往前找不到字符ch则返回-1
(按%d打印成了INT_MAX
)。
string substr(size_t pos = 0, size_t n = npos)const
substr函数是返回字符串中pos位置到n位置之间的元素。
注意:
1.pos和n都为缺省参数,不传入时,pos默认为0,n默认为最后一个位置npos。
2.pos若越界,无论前越还是后越,都将编译失败,抛出异常。
3.n若越界,无论前越还是后越,都处理为npos。
三、代码实现
代码实现过于庞大,此处就不一一列举,想要参考代码的可以进入下面的链接,在我的github里面取:https://github.com/adong001/Test/tree/master/C%2B%2B_Test0915