目录
- 一、C与C++字符串的差别
- 二、string类对象的容量操作
- 三、string类中的常见API
- 总览
- 1.构造
- 2.赋值
- 重载赋值操作符 =
- 成员函数 assign
- 3.存取
- 重载下标获取操作符 [ ]
- 成员函数 at
- 4.拼接
- 重载复合操作符 +=
- 成员函数 append
- 5.查找
- 成员函数 find
- 成员函数 rfind
- 成员函数 replace
- 6.比较
- 成员函数 compare
- 重载比较操作符
- 7.子串
- 成员函数 substr
- 8.插入
- 成员函数 insert
- 9.删除
- 成员函数 erase
一、C与C++字符串的差别
- C语言下的字符串:
char*
是一个指针。 - C++下的字符串:
string
是一个类,类内部封装了char
来管理字符串,是一个char&
型的容器。
相比于C语言下以
'\0'
结尾中间不能含有任何'\0'
的字符串,C++的string类的字符串可以存在任何东西,包括'\0'
。
二、string类对象的容量操作
函数名称 | 功能说明 |
---|---|
size | 返回字符串的有效长度。 |
length | 返回字符串的有效字符长度。 |
capacity | 返回空间的总大小。 |
empty | 检测字符串是否为空串,是返回true,否返回false。 |
clear | 清空有效字符。 |
reserve | 为字符串预留空间。 |
resize | 将有效字符的个数改为n个,多出的空间用字符c填充。 |
三、string类中的常见API
在编程中,API
(Application Programming Interface)是指一组已定义的接口或函数,用于让不同的软件组件之间进行交互和通信,实现不同应用程序之间的互操作性。
总览
引用的头文件:#include<string>
string的使用需用到命名空间std
1.构造
C++中的string类默认构造函数的字符串初始值是空字符串,即长度为0的字符串。
string();
//默认构造函数,创建一个空的字符串
string(const string& str);
//拷贝构造函数,使用一个string对象初始化另一个string对象
string(const char*s);
//含参构造函数,使用C风格字符串初始化
string(int n, char c);
//含参构造函数,使用n个字符c初始化
代码使用如下:
string s1;//默认构造
string s2(s1);
string s3("Hello World!");
string s4(10, 'a');//用10个'a'来初始化字符串
2.赋值
重载赋值操作符 =
string& operator=(const char* s);
//C风格字符串赋值给当前的字符串
string& operator=(const string& s):
//把字符串s赋给当前的字符串
string& operator=(const char c);
//字符赋值给当前的字符串
代码使用如下:
string s1;
string s2("Hello World!");
s1 = s2;
s1 = "Hello World!";
s1 = '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 char* s, int pos, int n);
//把C风格字符串s中从start开始的n个字符赋值给当前字符串
string& assign(const string& s, int start, int n);
//将字符串s中从start开始的n个字符赋值给当前字符串
string& assign(const string& s, int start);
//将字符串s中从start开始直至结束的字符赋值给当前字符串
代码使用如下:
string s1;
string s2("Hello World!");
s1.assign("Hello World!");
s1.assign("Hello World!", 5);
s1.assign(s2);
s1.assign(14, 'c');
s1.assign("Hello World!", 6, 3);
s1.assign(s2, 6, 3);
s1.assign(s2, 6);
3.存取
重载下标获取操作符 [ ]
使用下标操作符获取字符时,如果下标越界,程序将会强制终止。
char& operator[](int n);
//通过[]下标方式获取字符
代码使用如下:
string s1("Hello World!");
s1[0];
s1[1];
s1[2];
成员函数 at
使用
at
方法获取字符时,如果下标越界,at
方法内部会抛出异常(exception),可以使用try-catch
捕获并处理该异常。
char& at(int n);
//通过at方法获取字符
代码使用如下:
string s1("Hello World!");
s1.at(0);
s1.at(1);
s1.at(2);
使用try-catch
捕获并处理该异常:
#include <iostream>
using namespace std;
int main()
{
string s = "hello world";
try
{
//s[100]不会抛出异常,程序会直接挂掉
s.at(100);
}
catch (out_of_range& e)
//如果不熟悉异常类型,可以使用多态特性,catch(exception& e)
{
cout << e.what() << endl;
//打印异常信息
}
//如果不熟悉异常类型,可以使用多态特性,catch(exception& e)
return 0;
}
4.拼接
重载复合操作符 +=
string& operator+=(const string& str);
//将字符串str追加到当前字符串末尾
string& operator+=(const char* str);
//将C风格字符数组追加到当前字符串末尾
string& operator+=(const char c);
//将字符c追加到当前字符串末尾
代码使用如下:
string s1;
string s2("Hello World!");
s1 += s2;
s1 += "Hello World!";
s1 += 'a';
成员函数 append
string& append(const char* s);
//把C风格字符数组s连接到当前字符串结尾
string& append(const char* s, int n);
//把C风格字符数组s的前n个字符连接到当前字符串结尾
string& append(const char* s, int pos, int n);
//把C风格字符数组s中从pos开始的n个字符连接到当前字符串结尾
string& append(const string& s);
//将字符串s追加到当前字符串末尾
string& append(const string& s, int pos, int n);
//把字符串s中从pos开始的n个字符连接到当前字符串结尾
string& append(const string& s, int pos);
//将字符串s中从pos开始直至结束的字符连接到当前字符串结尾
string& append(int n, char c);
//在当前字符串结尾添加n个字符c
代码使用如下:
string s1;
string s2("Hello World!");
s1.append("Hello World!");
s1.append("Hello World!", 5);
s1.append("Hello World!", 6, 3);
s1.append(s2);
s1.append(s2, 6, 3);
s1.append(s2, 6);
s1.append(5, 'o');
5.查找
成员函数 find
当查找失败时, find方法会返回-1,-1已经被封装为string的静态成员常量
string::nposo
。
int find(const string& str, int pos = 0) const;
//查找str在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0
int find(const char* s, int pos = 0) const;
//查找C风格字符串s在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0
int find( const char* s, int pos, int n) const;
//从pos位置查找s的前n个字符在当前字符串中第一次出现的位置
int find(const char c, int pos = 0) const;
//查找字符c第一次出现的位置,从pos开始查找,pos默认为0
成员函数 rfind
rfind(str, pos)
的实际的开始位置是pos
+str.size()
,即从该位置开始 (不包括该位置字符) 向前寻找匹配项,如果有则返回字符串位置,如果没有返回string::npos
。
int rfind(const string& str, int pos = npos)const;
//在当前字符串中,从pos位置开始查找str的最后一次出现位置
int rfind(const char* s, int pos = npos) const;
//在当前字符串中,从pos位置开始查找s的最后一次出现位置,计数永远是从前往后
int rfind(const char* s, int pos, int n) const;
//从pos位置开始查找前n个字符,找到s最后一次出现的位置
int rfine(const char c, int pos = npos) const;
//在当前字符串中,从pos位置开始查找字符c的最后一次出现位置
关于
string::npos
-1其实是size t
类的最大值 (补码知识) ,所以string::npos其实表示“直到字符串结束”。
同时,可以发现string::npos和container.end()送代器其实是相同含义的,说明STL各个模块的设计是统一的。
成员函数 replace
string& replace(int pos, int n, const string& str);
//将当前字符串的从pos开始的n个字符,替换为字符串str
string& replace(int pos, int n, const char* s);
//将当前字符串的从pos开始的n个字符,替换为字符串s
代码的使用如下:
string s1;
string s2("Hello World!");
s1.append("Hi");
s1.append("Hi");
s2.replace(0, 5, s1);
cout << s2 << endl;
输出结果:
Hi World!
6.比较
成员函数 compare
- 字符串比较是按字符的
ASCII码
进行对比
compare函数依据字典序比较,在当前字符串比给定字符串小时返回-1,在当前字符串比给定字符串大时返回1,相等时返回0。
在C++中,使用string类的compare函数比较两个字符串的大小时,如果短字符串是长字符串的前缀,那么结果是短字符串小于长字符串。
int compare(const string& s) const;
//与字符串s比较
int compare(const char* s) const;
//与C风格的字符数组比较
代码的使用如下:
string s1;
string s2("Hello World!");
//s1的字符串内容为"Hello"
s1.assign(s2, 0, 4);
cout << s1.compare(s2) << endl;
输出结果:
-1
重载比较操作符
bool operator<(const string& str) const;
bool operator<(const char* str) const;
bool operator<=(const string& str) const;
bool operator<=(const char* str) const;
bool operator==(const string& str) const;
bool operator==(const char* str) const;
bool operator>(const string& str) const;
bool operator>(const char* str) const;
bool operator>=(const string& str) const;
bool operator>=(const char* str) const;
bool operator!=(const string& str) const;
bool operator!=(const char* str) const;
7.子串
成员函数 substr
string substr(int pos = 0, int n = npos) const;
//返回由pos开始的n个字符组成的字符串
string::npos
的含义是到整个字符串结束
代码的使用如下:
string s5(s2.substr(0, 5));
cout << s5 << endl;
输出结果:
Hello
8.插入
成员函数 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
9.删除
成员函数 erase
string::npos的含义是删除到整个字符串结束。
string& erase int pos, int n = npos);
//删除从pos位置开始的n个字符