STL六大组件
什么是string
在 C++ 中,
string
是标准库中的一个类,它用于表示和处理字符串。
string
类是定义在<string>
头文件中的,它提供了丰富的成员函数来支持字符串的各种操作,如拼接、查找、替换等。
底层实现
string
类的底层实现通常依赖于动态数组,这个动态数组用于存储字符序列。具体来说,它通常包含以下三个部分:
- 字符数组:用于存储实际的字符串数据。
- 长度:记录当前字符串中的字符数量。
- 容量:记录当前分配的内存可以容纳的字符数量
以下是string类的私有成员:
template <typename _CharT, typename _Traits, typename _Alloc> class basic_string { private: _CharT* _MyPtr; // 指向分配的内存的指针 size_t _size; // 字符串的长度 size_t _capacity; // 分配的内存容量 };
为什么要学习string
- 抽象度高:`string`提供高级抽象,简化内存管理。
- 功能丰富:内置操作集,提升开发效率。
- 安全性好:预防缓冲区溢出,保障程序安全。
- 跨平台:标准库组件,确保代码可移植性。
简单来说就是:省事、安全、通用、强大
- 省事:用`string`处理文字更方便,不用手动管理内存。
- 安全:用`string`不容易出错,减少程序崩溃的风险。
- 通用:不管在哪个系统,`string`的表现都一样,方便移植。
- 强大:`string`能干的事情多,比如查找、替换文字都很简单。
string常用接口
构造函数
1、无参构造函数
函数原型:string();
创建了一个空的string对象
2、带参构造函数
函数原型:string(const char* s);
用字符串(即以'\0'结尾的字符数组)初始化string对象
3、拷贝构造函数
函数原型:string& operator=(const string& str);
这个操作符重载函数允许你使用一个string对象来赋值给另一个已经存在的string对象
4、构造n个单字符函数
函数原型:string(size_t n,char c);
创建一个包含n
个字符c
的string
对象
容量操作接口
1、size();
size_t size() const;
返回字符串中字符的数量
2、length();
size_t length() const;
与size()函数作用相同,实际没有什么区别; 返回字符串中字符的数量
3、capacity();
size_t capacity() const;
返回字符串当前容量,即在不重新分配内存的情况下,字符串可以容纳的最大字符数
简单来说就是:像文本文件当前可以容纳多少字符而不会超出文件系统的分配
4、reserve();
void reserve(size_t new_cap);
用来设置字符串的容量至少为
new_cap
5、resize();
void resize(size_t n);
用来改变字符串的长度到
n
个字符
代码 && 4、5点总结
访问和遍历
1、operator[]
char& operator[](sizet pos);
允许像访问数组一样访问字符串中的单个字符。它返回指定位置pos的字符的引用。如果你提供的索引超出了字符串的范围,它不会检查边界,可能会导致未定义行为
2、迭代器
①正向迭代器:iterator begin();
②反向迭代器:reverse_iterator rbegin();
正向迭代器
begin()
返回指向字符串第一个字符的迭代器,而反向迭代器
rbegin()
返回指向字符串最后一个字符的迭代器。迭代器可以用来遍历字符串中的所有字符。
迭代器的本质是范围for
3、at
char& at(sizet pos);
返回指定位置
pos
的字符的引用与
operator[]
不同的是,如果pos
超出了字符串的范围,at
会抛出一个std::out_of_range
异常。
4、front and back
front原型:char& front();
back原型:char& back();
front()
返回字符串第一个字符的引用,而
back()
返回字符串最后一个字符的引用如果字符串为空,这些操作将导致未定义行为
5、find and rfind (与npos)
find原型:sizet find(const string& str, sizet pos 0) const;
rfind原型:sizet rfind(const string& str, sizet pos npos) const;
find()
从字符串的起始位置开始查找子字符串str
,返回第一次出现的位置索引。如果找不到,返回npos
。rfind()从字符串的末尾开始查找子字符串str,返回最后一次出现的位置索引。如果找不到,也返回npos
什么是npos?
npos是std::string类中的一个静态常量成员,表示不存在的位置,它的值通常是一个非常大的数,可以认为是字符串的最大可能大小加1
当查找函数返回npos时,意味着没有找到匹配项
6、c_str
const char* c_str() const;
返回一个指向以空字符终止的字符数组的指针,这个数组与字符串的内容相同。这通常用于在需要C风格字符串的函数中使用std::string对象
修改字符串操作
1、operator+=
string& operator+=(const string& str); //追加一个string类 string& operator+=(const char* s); //追加字符串 string& operator+=(char c); //追加字符
用于将一个字符串或字符追加到当前字符串的末尾
2、push_back
void push_back(char c);
用于将一个字符添加到字符串的末尾
3、append
string& append(const string& str); // 追加string string& append(const char* s); // 追加字符串 string& append(const char* s, size_t n); // 追加字符串的前n个字符 string& append(size_t n, char c); // 追加n个字符
用于将字符串或字符序列追加到当前字符串的末尾
4、insert
string& insert(size_t pos, const string& str); string& insert(size_t pos, const char* s); string& insert(size_t pos, const char* s, size_t n); string& insert(size_t pos, size_t n, char c); iterator insert(iterator p, char c); void insert(iterator p, size_t n, char c); void insert(iterator p, iterator first, iterator last);
用于在字符串的指定位置插入另一个字符串或字符序列
5、erase
string& erase(size_t pos = 0, size_t len = npos); iterator erase(iterator p); iterator erase(iterator first, iterator last);
用于从字符串中移除字符,可以移除单个字符,也可以移除一个范围内的字符
6、swap
void swap(string& str);
用于交换两个字符串的内容
7、operator+
string operator+(const string& str1, const string& str2); string operator+(const string& str, const char* s); string operator+(const char* s, const string& str); string operator+(const string& str, char c); string operator+(char c, const string& str);
用于连接两个字符串或字符串与字符
8、getline
istream& getline(istream& is, string& str, char delim = '\n');
用于从输入流中读取一行,直到遇到指定的分隔符(默认是换行符),并将其存储到字符串中。
各种运算符重载函数
1、operator>> and operator<<
istream& operator>>(istream& is, string& str); ostream& operator<<(ostream& os, const string& str);
operator>>
:这个运算符重载用于从输入流(如cin
)读取字符串。它读取直到下一个空白字符(空格、制表符或换行符)为止的字符序列,并将其存储到字符串中operator<<
:这个运算符重载用于将字符串输出到输出流(如cout
)。它将字符串的内容输出到流中。
2、比较运算符,根据ASCII码值比较
bool operator==(const string& str) const; bool operator!=(const string& str) const; bool operator<(const string& str) const; bool operator>(const string& str) const; bool operator<=(const string& str) const; bool operator>=(const string& str) const;