当前位置: 首页 > ops >正文

《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;
}
http://www.xdnf.cn/news/16418.html

相关文章:

  • vue3报错:this.$refs.** undefined
  • 在Podman/Docker容器中为Luckfox Lyra Zero W编译SDK:终极排错指南
  • Linux实战:从零搭建基于LNMP+NFS+DNS的WordPress博客系统
  • yolo11分类一键训练工具免安装环境windows版使用教程
  • 小白成长之路-Ansible自动化(一)
  • 20250707-2-Kubernetes 网络-Ingress暴露应用(http与https)_笔记
  • LeetCode 60:排列序列
  • 10.模块与包:站在巨人的肩膀上
  • MySQL ROUTER安装部署
  • 网络配置实验报告:主机间通信配置
  • python---eval函数
  • Day44 Java数组08 冒泡排序
  • 51核和ARM核单片机OTA实战解析(二)
  • day062-监控告警方式与Grafana优雅展示
  • 【通识】设计模式
  • Ashampoo Background Remover(照片去背景工具) v2.0.2 免费版
  • MyBatis-Plus IService 接口全量方法实现与测试(续)
  • 【Python系列】从内存分析到性能剖析
  • 【c++】从 “勉强能用” 到 “真正好用”:中文问答系统的 200 行关键优化——关于我用AI编写了一个聊天机器人……(16)
  • HBuilder X打包发布微信小程序
  • 详解力扣高频SQL50题之180. 连续出现的数字【困难】
  • Product Hunt 每日热榜 | 2025-07-27
  • 如何思考一个动态规划问题需要几个状态?
  • J2EE模式---服务层模式
  • springboot基于Java与MySQL库的健身俱乐部管理系统设计与实现
  • 【前后端】node mock.js+json-server
  • vscode找不到python解释器的解决方案
  • listen() 函数详解
  • Petalinux驱动开发
  • 多智能体系统设计:协作、竞争与涌现行为