《C++》STL--string详解(上)
文章目录
- 一、简介
- 二、string类常用构造
- 2.1.详解
- 2.2示例
- 三、string类对象的容量操作
- 3.1详解
- 3.2示例
- 四、string类对象的访问及遍历操作
- 4.1什么是迭代器
- 4.2访问及遍历方法
- 4.3示例
- 五、string类对象的修改操作
- 5.1详解
- 5.2示例
一、简介
在C++中,string类提供了多种构造函数来创建字符串对象。了解这些构造函数的用法对于高效使用string类至关重要。本文将详细介绍string类的各种构造函数及其应用场景。
二、string类常用构造
2.1.详解
构造函数形式 | 功能说明 |
---|---|
string() | 构造空的string类对象(空字符串) |
string(const char* s) | 用C风格字符串构造string对象 |
string(const string&s) | 拷贝构造函数,用另一个string对象构造新对象 |
string(size_t n, char c) | 构造包含n个字符c的string对象 |
2.2示例
#include <iostream>
#include <string>
using namespace std;int main() {// 多种初始化方式string s1; // 空字符串string s2("Hello"); // 使用C风格字符串初始化string s3 = "World"; // 赋值初始化string s4(5, 'A'); // 5个'A'组成的字符串"AAAAA"string s5(s2); // 拷贝构造cout << "s1: " << s1 << endl;cout << "s2: " << s2 << endl;cout << "s3: " << s3 << endl;cout << "s4: " << s4 << endl;cout << "s5: " << s5 << endl;return 0;
}
三、string类对象的容量操作
3.1详解
函数名称 | 功能说明 |
---|---|
size() | 返回字符串有效字符长度 |
length() | 与size()功能相同,返回字符串有效字符长度 |
capacity() | 返回当前为字符串分配的空间总大小 |
empty() | 检测字符串是否为空串,是返回true,否则返回false |
clear() | 清空字符串中的所有有效字符 |
reserve(n) | 为字符串预留空间,但不改变字符串内容(不会缩小容量) |
resize(n, c) | 将有效字符的个数改为n个,多出的空间用字符c填充(c可选,默认为空字符) |
3.2示例
#include <iostream>
#include <string>
using namespace std;void capacityDemo() {string str = "Hello";cout << "初始状态:" << endl;cout << "内容: " << str << endl;cout << "size: " << str.size() << endl;cout << "length: " << str.length() << endl;cout << "capacity: " << str.capacity() << endl;cout << "empty: " << boolalpha << str.empty() << endl;// 使用reserve增加容量str.reserve(50);cout << "\nreserve(50)后:" << endl;cout << "size: " << str.size() << endl;cout << "capacity: " << str.capacity() << endl;// 使用resize改变大小str.resize(10, '!');cout << "\nresize(10, '!')后:" << endl;cout << "内容: " << str << endl;cout << "size: " << str.size() << endl;// 清空字符串str.clear();cout << "\nclear()后:" << endl;cout << "内容: " << str << endl;cout << "empty: " << str.empty() << endl;
}int main() {capacityDemo();return 0;
}
四、string类对象的访问及遍历操作
4.1什么是迭代器
-
迭代器(Iterator)是C++中一种类似指针的对象,它提供了一种统一的方式来访问和遍历容器(如vector、list、map等)中的元素。迭代器是
STL
(标准模板库)的核心组件之一,它充当容器与算法之间的桥梁。 -
可以把迭代器想象成书中的页码:
-
书(容器)包含许多页(元素)
-
页码(迭代器)帮助你定位特定页
-
翻页操作(++/–)让你浏览全书
-
4.2访问及遍历方法
方法名称 | 功能说明 |
---|---|
operator[] | 返回pos位置的字符,const string类对象调用 |
at(pos) | 返回pos位置的字符,提供边界检查 |
begin() + end() | begin获取第一个字符的迭代器,end获取最后一个字符下一个位置的迭代器 |
rbegin() + rend() | rbegin获取最后一个字符的迭代器,rend获取第一个字符前一个位置的迭代器 |
4.3示例
#include <iostream>
#include <string>
using namespace std;void accessAndTraversalDemo() {string str = "Hello World";// 1. 使用operator[]访问cout << "使用operator[]访问:" << endl;for (size_t i = 0; i < str.size(); ++i) {cout << str[i] << " ";}cout << endl;// 2. 使用at()访问(带边界检查)cout << "\n使用at()访问:" << endl;try {for (size_t i = 0; i <= str.size(); ++i) { // 故意越界cout << str.at(i) << " ";}} catch (const out_of_range& e) {cout << "\n捕获异常: " << e.what() << endl;}// 3. 使用迭代器遍历cout << "\n使用迭代器遍历:" << endl;for (auto it = str.begin(); it != str.end(); ++it) {cout << *it << " ";}cout << endl;// 4. 使用反向迭代器cout << "\n使用反向迭代器遍历:" << endl;for (auto rit = str.rbegin(); rit != str.rend(); ++rit) {cout << *rit << " ";}cout << endl;int main() {accessAndTraversalDemo();return 0;
}
五、string类对象的修改操作
5.1详解
函数名称 | 功能说明 |
---|---|
push_back(a) | 在字符串末尾插入字符a |
append(str) | 在字符串后追加一个字符串 |
operator+=(str) | 在字符串后追加字符串str(最常用的追加方式) |
c_str() | 返回C格式的字符串(const char*),用于与C函数交互 |
find(c, pos) | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 |
rfind(c, pos) | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
substr(pos, n) | 从pos位置开始,截取n个字符并返回 |
insert(pos, str) | 在pos位置插入字符串str |
erase(pos, n) | 从pos位置开始删除n个字符 |
replace(pos, n, str) | 从pos位置开始替换n个字符为str |
5.2示例
#include <iostream>
#include <string>
using namespace std;void modificationDemo() {string str = "C++ Programming";// 1. push_backstr.push_back('!');cout << "push_back后: " << str << endl;// 2. appendstr.append(" is fun");cout << "append后: " << str << endl;// 3. operator+=str += " and powerful";cout << "operator+=后: " << str << endl;// 4. c_str()演示cout << "\n使用c_str()输出: ";printf("%s\n", str.c_str());// 5. find和rfindsize_t pos = str.find("fun");cout << "\n'fun'首次出现在位置: " << pos << endl;pos = str.rfind('o');cout << "'o'最后一次出现在位置: " << pos << endl;// 6. substrstring sub = str.substr(4, 11);cout << "\n子串(4,11): " << sub << endl;// 7. insertstr.insert(0, "I think ");cout << "insert后: " << str << endl;// 8. erasestr.erase(0, 8); // 删除"I think "cout << "erase后: " << str << endl;// 9. replacestr.replace(4, 11, "coding");cout << "replace后: " << str << endl;
}int main() {modificationDemo();return 0;
}