【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析

C++ string 类详解:从入门到精通

💬 欢迎讨论:学习过程中有问题吗?随时在评论区与我交流。你们的互动是我创作的动力!

👍 支持我:如果你觉得这篇文章对你有帮助,请点赞、收藏并分享给更多朋友吧!

🚀 一起成长:欢迎分享给更多对 C++ 感兴趣的小伙伴,让我们共同进步!

前言

C++ 标准库中的 string 类是操作字符串的强大工具。与传统的 C 风格字符串(char[])相比,string 不仅支持自动内存管理,还提供了多种简洁而强大的接口。本文将带你详细了解 string 的常见用法、构造方法、容量操作、访问与修改等操作,帮助你从容应对实际开发中涉及字符串操作的场景。


第一章:C 语言中的字符串 vs C++ string

1.1 C 语言中的字符串

在 C 语言中,字符串本质上是以 \0 结尾的字符数组。C 标准库为此提供了 str 系列函数,如 strlen()strcpy()strcat() 等。虽然这些函数可以操作字符串,但它们的操作十分繁琐且容易出错,尤其是在内存管理方面。

例如,在 C 语言中进行字符串拼接的代码如下:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[50] = "Hello";
    char str2[50] = " World";

    // 字符串连接
    strcat(str1, str2);

    printf("%s\n", str1);  // 输出:Hello World

    return 0;
}

问题:C 语言中的字符串操作容易出现内存溢出,因为需要手动管理字符数组的长度。

1.2 C++ string 类的优势

C++ 中的 string 类使得字符串操作更加安全和简便。它封装了复杂的内存管理,并提供了类似数组的接口,开发者不再需要手动管理字符串的长度和内存。例如,使用 string 进行字符串拼接:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str1 = "Hello";
    string str2 = " World";

    // 使用 += 操作符进行拼接
    str1 += str2;

    cout << str1 << endl;  // 输出:Hello World

    return 0;
}

第二章:string 类的构造与基础操作

2.1 string 类的构造方法

string 类支持多种构造方式,以下是常见的构造函数:

函数名 功能描述
string() 默认构造一个空字符串
string(const char* s) 使用 C 字符串 s 构造 string 对象
string(size_t n, char c) 构造一个包含 n 个字符 c 的字符串
string(const string& s) 使用已有的 string 对象进行拷贝构造
2.1.1 示例代码:构造字符串
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s1;                 // 空字符串
    string s2("Hello C++");     // 通过C字符串初始化
    string s3(s2);              // 拷贝构造
    string s4(5, 'A');          // 5个'A'字符的字符串

    cout << "s1: " << s1 << endl;
    cout << "s2: " << s2 << endl;
    cout << "s3: " << s3 << endl;
    cout << "s4: " << s4 << endl;

    return 0;
}

输出示例

s1: 
s2: Hello C++
s3: Hello C++
s4: AAAAA

2.2 string 对象的常见操作

函数名 功能描述
size() 返回字符串的长度
length() 返回字符串的长度,与 size() 等价
capacity() 返回当前分配的存储空间大小
empty() 判断字符串是否为空,若为空返回 true
clear() 清空字符串内容
reserve() 为字符串预留存储空间,不改变有效字符的个数
resize() 改变字符串的长度,若增大则用默认字符填充
2.2.1 示例代码:字符串容量操作

注意:

  1. size()length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()
  2. clear()只是将string中有效字符清空,不改变底层空间大小。
  3. resize(size_t n)resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不 同的是当字符个数增多时:resize(n)'\0'来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。
  5. sizecapacity都不包括’\0’


#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "Hello";

    cout << "Size: " << s.size() << endl;     // 返回字符串长度
    cout << "Capacity: " << s.capacity() << endl;  // 返回容量
    s.resize(10, 'X');                        // 将长度改为10,多出部分用'X'填充
    cout << "Resized: " << s << endl;
    s.clear();                                // 清空字符串
    cout << "Is empty: " << s.empty() << endl;  // 检查是否为空

    return 0;
}

输出示例

Size: 5
Capacity: 15
Resized: HelloXXXXX
Is empty: 1

2.3 字符串的遍历与访问

可以通过以下几种方式访问字符串中的字符:

方法 功能描述
operator[] 返回或设置指定位置的字符
at() 返回指定位置的字符并进行边界检查
begin()/end() 返回字符串的首尾迭代器,用于遍历字符串
rbegin()/rend() 返回反向迭代器,支持从后向前遍历字符串
push_back() 在字符串末尾追加一个字符
append() 在字符串末尾追加另一个字符串或子字符串

注意:

  1. string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
2.3.1 示例代码:遍历与访问字符
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "Hello C++";

    // 使用下标访问
    cout << "First character: " << s[0] << endl;

    // 使用迭代器遍历
    for (auto it = s.begin(); it != s.end(); ++it) {
        cout << *it << ' ';
    }
    cout << endl;

    return 0;
}

输出示例

First character: H
H e l l o   C + +

第三章:字符串的高级操作

3.1 字符串的查找操作

string 类提供了多种查找子字符串或字符的方法。常见的查找方法如下:

函数名 功能说明
find() 在字符串中查找子字符串或字符,返回其首次出现的位置,找不到则返回 string::npos
rfind() 反向查找字符串,返回最后一次出现子串或字符的位置
find_first_of() 查找指定字符集中的任意一个字符,返回第一次出现的索引
find_last_of() 查找指定字符集中的任意一个字符,返回最后一次出现的索引

string::nposstd::string 类的一个常量静态成员变量,它是用来表示查找操作失败时的返回值。

  • 它通常等于无符号整数类型的最大值size_t(-1)),具体值是实现定义的,但它在所有实现中都用于表示“未找到”的状态。
#include <iostream>
#include <string>
using namespace std;

int main() {
    cout << "Value of string::npos: " << string::npos << endl;
    return 0;
}

输出结果:

Value of string::npos: 18446744073709551615  // 这是 size_t 的最大值 (通常等于 -1)


3.1.1 示例代码:查找子字符串
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "Hello World";

    // 查找 "World" 在字符串中的位置
    size_t pos = s.find("World");
    if (pos != string::npos) {
        cout << "'World' found at position: " << pos << endl;
    } else {
        cout << "'World' not found" << endl;
    }

    // 反向查找 'o'
    size_t rpos = s.rfind('o');
    cout << "'o' last found at position: " << rpos << endl;

    return 0;
}

输出示例

'World' found at position: 6
'o' last found at position: 7


3.1.2 示例代码:查找任意字符
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "Hello, World!";
    string charset = "aeiou";  // 查找元音字母

    // 使用 find_first_of 查找字符集中任意字符第一次出现的位置
    size_t first_pos = s.find_first_of(charset);
    if (first_pos != string::npos) {
        cout << "First vowel in the string found at position: " << first_pos << endl;
    } else {
        cout << "No vowel found in the string." << endl;
    }

    // 使用 find_last_of 查找字符集中任意字符最后一次出现的位置
    size_t last_pos = s.find_last_of(charset);
    if (last_pos != string::npos) {
        cout << "Last vowel in the string found at position: " << last_pos << endl;
    } else {
        cout << "No vowel found in the string." << endl;
    }

    return 0;
}

输出示例

First vowel in the string found at position: 1
Last vowel in the string found at position: 8
3.1.3 相关链接

3.2 字符串的比较操作

在 C++ 中,string 类支持字符串的比较操作,既可以使用运算符 ==!=<> 等,也可以通过 compare() 方法进行更细粒度的比较。

方法 功能说明
operator== 判断两个字符串是否相等
operator!= 判断两个字符串是否不相等
operator< 判断当前字符串是否小于另一个字符串
operator> 判断当前字符串是否大于另一个字符串
compare() 进行详细的字符串比较,返回 0 表示相等,负值表示小于,正值表示大于
3.2.1 示例代码:字符串比较
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str1 = "Apple";
    string str2 = "Banana";

    if (str1 == str2) {
        cout << "Strings are equal" << endl;
    } else {
        cout << "Strings are not equal" << endl;
    }

    // 使用 compare() 方法比较
    int result = str1.compare(str2);
    if (result == 0) {
        cout << "Strings are equal" << endl;
    } else if (result < 0) {
        cout << "str1 is less than str2" << endl;
    } else {
        cout << "str1 is greater than str2" << endl;
    }

    return 0;
}

输出示例

Strings are not equal
str1 is less than str2
3.2.2 相关链接

3.3 字符串的替换操作

在 C++ 中,string 类允许我们通过 replace() 方法替换字符串中的部分内容。

函数名 功能说明
replace() 替换从指定位置开始的若干字符为新字符串
3.3.1 示例代码:替换字符串中的部分内容
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello World";

    // 替换 "World" 为 "C++"
    str.replace(6, 5, "C++");

    cout << str << endl;  // 输出:Hello C++

    return 0;
}

输出示例

Hello C++
3.3.2 相关链接

3.4 字符串的截取操作

string 类提供了 substr() 方法来提取字符串中的子字符串。该方法非常有用,尤其是在处理文件路径或URL时。

函数名 功能说明
substr() 从指定位置开始,截取若干字符并返回子字符串
3.4.1 示例代码:提取子字符串
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello World";

    // 从位置 6 开始截取 5 个字符
    string sub = str.substr(6, 5);

    cout << "Substring: " << sub << endl;

    return 0;
}

输出示例

Substring: World
3.4.2 相关链接

3.5 字符串的插入与删除操作

在 C++ 中,string 类支持通过 insert() 在字符串的指定位置插入子字符串,或通过 erase() 从指定位置删除字符。

这两个方法因为时间复杂度挺高的,所以还是避免常用

函数名 功能说明
insert() 在字符串的指定位置插入字符或子字符串
erase() 删除字符串中指定位置的若干字符
3.5.1 示例代码:插入与删除操作
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello World";

    // 在索引 5 处插入一个逗号
    str.insert(5, ",");
    cout << "After insert: " << str << endl;

    // 删除索引 5 开始的 1 个字符
    str.erase(5, 1);
    cout << "After erase: " << str << endl;

    return 0;
}

输出示例

After insert: Hello, World
After erase: Hello World
3.5.2 相关链接

3.6 字符串与数值的转换

C++ 提供了 to_string()stoi() 等函数,帮助我们在字符串和数值之间进行转换。这在处理用户输入、文件解析等场景中非常常用。

函数名 功能说明
to_string() 将数值转换为字符串
stoi() 将字符串转换为整数
stof() 将字符串转换为浮点数
3.6.1 示例代码:数字与字符串的相互转换
#include <iostream>
#include <string>
using namespace std;

int main() {
    int num = 42;
    string str = to_string(num);  // 数字转字符串
    cout << "String: " << str << endl;

    string strNum = "123";
    int parsedNum = stoi(strNum);  // 字符串转整数
    cout << "Parsed Integer: " << parsedNum << endl;

    return 0;
}

输出示例

String: 42
Parsed Integer: 123
3.6.2 相关链接

写在最后

本文详细解析了 C++ string 类的常见构造方法、容量操作、字符访问、字符串的拼接、查找、比较等操作。希望这些内容能够帮助你更好地理解和使用 string 类。

💬 欢迎讨论:如果你有任何问题或建议,请在评论区留言。

👍 支持一下:如果你觉得这篇文章对你有帮助,请点赞、收藏并分享!你们的支持是我持续创作的动力!

以上就是关于【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️

目录
相关文章
|
2月前
|
数据可视化 数据挖掘 BI
团队管理者必读:高效看板类协同软件的功能解析
在现代职场中,团队协作的效率直接影响项目成败。看板类协同软件通过可视化界面,帮助团队清晰规划任务、追踪进度,提高协作效率。本文介绍看板类软件的优势,并推荐五款优质工具:板栗看板、Trello、Monday.com、ClickUp 和 Asana,助力团队实现高效管理。
71 2
|
1天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
1天前
|
C++
模拟实现c++中的string
模拟实现c++中的string
|
1月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
68 19
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
50 13
|
1月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
50 5
|
1月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
40 5
|
1月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
48 4
|
1月前
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
32 3
|
3月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
139 5

推荐镜像

更多