一、标准库中的 string
string类是什么:
string类的详细文档介绍
简要总结:
- string 类是表示字符序列(字符串)的类
- 使用 string 类,必须包含头文件
#include<string>
// 如果要使用C风格字符串,可以使用下面两个头文件
#include<string.h>
#include<cstring>
using namespace std;
int main()
{
std::string s1; // 如果不使用using namespace std语句,每次使用string类都需要加 std::
string s2;
}
另外,为方便string使用,一般使用语句 using namespace std;
(string类是一个模板类,在名字空间 std 中)否则每次使用需要 std::string
- string 类的接口类似于其他容器的接口,但添加了一些专门用于操作单字节字符,字符串的操作.
- string 类的底层是 basic_string 模板类使用 char 实例化的一个实例.
- string 类不能操作多字节或者变长字节序列,因为 string 类的所有成员及迭代器会仍然按照字节操作,而不是实际编码的字符.
二、string 类的常用接口
- string 对象的常用构造
string() | 构造了一个空的string类对象(空字符串) |
---|---|
string(const char *str) | 使用c-字符串构造string类对象 |
string(size_t n, char c) | 构造出由n个c字符组成的string类对象 |
string(const string &s) | 拷贝构造(相当于将对象 s 复制一份) |
string(const string &s, size_t n) | 使用对象 s 的前n个字符构造 |
使用示例:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1; // 构造空 string 对象s1
string s2("hello"); // C风格字符串构造s2
string s3(3, 'a'); // 3个字符'a'构造 s3对象
string s4(s2); // 拷贝构造
string s5(s2, 3); // 用s2中前3个字符构造s5
return 0;
}
2.string 类对象的访问操作
char &operator [ ] (size_t pos) | 由 非const string 类对象调用,返回pos位置处字符(可修改) |
---|---|
const char &operator[ ] | 由const string 类对象调用,返回pos位置处字符(不可修改) |
迭代器访问 | 与其他容器操作相同(string类不常用) |
示例:
void access_string()
{
string s1("hello");
const string s2(s1); // 拷贝构造
for (int i = 0; i < s1.size(); i++)
{
cout << s1[i]; // [] 访问
}
cout << endl; // 换行
s1[0] = 'a'; // 将对象s1首元素修改为 'a'
//s2[0] = 'a'; // 该句错误,const 修饰s2,不可修改
string::iterator it = s1.begin(); // 初始化迭代器
for (; it < s1.end(); it++)
{
cout << *it; // 此处迭代器可理解为指针,对指针解引用
}
}
3.string 类对象的容量操作
size_t size() const | 返回字符串有效字符长度(数量) |
---|---|
size_t length() const | 返回字符串有效字符长度(与size()方法的底层实现完全相同) |
size_t capacity() const | 返回对象空间大小 |
bool empty() const | 检测对象是否为空,为空返回true,否则返回false |
void clear() | 清空字符串对象有效字符(不改变底层空间大小) |
void resize(size_t n) | 将有效字符的个数修改为n个,多出的空间用0填充 |
void resize(size_t n, char c) | 将有效字符的个数修改为n个,多出的空间用字符’c’填充 |
void reserve(size_t res_arg = 0) | 为字符串直接预设 res_arg 大小的空间 |
示例:
void CapacityOperator()
{
// string 类支持直接使用 cout cin 操作
char arr[] = "abcd";
string s1(arr);
string s2(s1);
cout << s1.size() << endl;
cout << s1.length() << endl;
cout << s1.capacity() << endl;
// 此处clear后,只改变了s1的size,并没有改变它的capacity
s1.clear();
cout << s1.size() << endl;
cout << s1.capacity() << endl;
// 将s1的有效字符长度置为10个,多出位置用 '\0' 填充
s1.resize(10);
cout << s1 << endl;
cout << s1.size() << endl;
cout << s1.capacity() << endl;
// 将s2的有效字符长度置为10个,多出位置用字符'c'填充
s2.resize(10, 'c');
cout << s2 << endl;
cout << s2.size() << endl;
cout << s2.capacity() << endl;
// 为s2预设20个空间长度
s2.reserve(20);
cout << s2.capacity() << endl;
}
注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于
string的底层空间总大小时,reserver不会改变容量大小
4.string 类对象的修改操作
void push_back(char c) | 在字符串后面插入一个字符c |
---|---|
string &append(const char *s) | 在字符串后面插入一个字符串 |
string &operator +=(const string &str) | 在字符串后面插入一个字符串 |
string &operator +=(const char* s) | 在字符串后面追加一个C风格字符串 |
string &operator +=(char c) | 在字符串后面追加一个字符c |
const char* c_str() const | 返回C风格字符串 |
size_t find(char c, size_t pos = 0) const | 从字符串pos位置向后查找字符c,返回其在字符串中的位置 |
size_t rfind(char c, size_t pos = npos) | 从字符串pos位置向前查找字符c,返回其在字符串中的位置 |
string substr(size_t pos = 0, size_t n = npos)const | 在字符串中从pos位置开始,截取n个字符然后将其返回 |
示例:
void ModifyString()
{
char arr[] = " 123asd";
string s1("hello");
s1.push_back('!'); // 在字符串后追加一个感叹号
s1.append(arr); // 在字符串后追加一个字符串
s1 += " this"; // 在字符串后追加一个字符串
s1 += "a"; // 在字符串后追加一个字符
cout << s1 << endl;
cout << s1.c_str() << endl; // 以C风格字符串打印
string s2("string.cpp");
size_t pos = s2.find('.'); // 从前向后在字符串s2中查找'.'位置
string s3(s2.substr(0,pos)); // 从字符串s2首元素开始向后截取到pos处
cout << s3 << endl;
}
输出结果: