【string】--字符串之舞:C++ 中 std::string 的优雅与深邃

前言

在 C++ 中,std::string 类是一个非常重要且常用的标准库类,它是 C++

标准库中的一种封装了字符数组的容器,提供了便捷的字符串操作接口。无论是简单的字符串拼接,还是复杂的字符串查找、替换操作,std::string

都能帮我们高效地实现。本文将详细介绍 std::string 类的基础知识、常用操作方法以及背后的实现原理。

string

  • 一、概述
    • [1.1 创建和初始化](#1.1 创建和初始化)
    • [1.2 常见函数](#1.2 常见函数)
    • [1.3 性能方面](#1.3 性能方面)

一、概述

std::string 类是 C++ 标准库中定义的一个类,它位于 std 命名空间中,用于处理动态大小的字符序列。与传统的 C字符串不同,std::string 不需要手动管理内存,且它支持丰富的操作方法,极大地简化了字符串的处理。
一个典型的 std::string 对象是可以动态扩展的,内存管理由 C++ 的标准库自动处理,因此比传统的 C 风格字符数组(char\[\])更加安全、灵活和高效。

cpp 复制代码
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, C++!";  // 创建一个字符串对象
    std::cout << str << std::endl;     // 输出字符串
    return 0;
}

1.1 创建和初始化

  • 直接赋值
cpp 复制代码
std::string str1 = "Hello"; // 使用字符串字面量
std::string str2("World");  // 使用构造函数
  • 字符数组
cpp 复制代码
char arr[] = "Hello";
std::string str(arr);  // 将字符数组转换为字符串
  • 使用std::string构造函数
cpp 复制代码
std::string str(10, 'a'); // 创建一个包含10个字符'a'的字符串

1.2 常见函数

  • size() 和 length():
cpp 复制代码
std::string str = "Hello";
std::cout << "Length: " << str.size() << std::endl;  // 或者 str.length()
  • capacity():
    capacity()返回字符串当前分配的内存容量(字节数),即字符串可以存储的最大字符数,而不需要重新分配内存。
cpp 复制代码
std::cout << "Capacity: " << str.capacity() << std::endl;
  • resize():
    resize()函数可以改变字符串的大小。如果新大小比当前小,字符串会被截断;如果新大小比当前大,则会用指定的字符填充新增部分。
cpp 复制代码
str.resize(8, 'x'); // 字符串长度变为8,新增的字符为'x'
std::cout << str << std::endl;  // 输出"Helloxxx"
  • find():
    find()用于查找子字符串的位置,返回子字符串第一次出现的索引。如果未找到,返回std::string::npos。
cpp 复制代码
std::string str = "Hello, World!";
std::size_t pos = str.find("World");
if (pos != std::string::npos) {
    std::cout << "Found 'World' at position: " << pos << std::endl;
}
  • rfind():
    rfind()从字符串的末尾开始查找子字符串,返回最后一次出现的位置。
cpp 复制代码
std::size_t pos = str.rfind("l");
std::cout << "Last 'l' found at: " << pos << std::endl;
  • substr():
    substr()函数用于提取子字符串。它接受两个参数:起始位置和长度。
cpp 复制代码
std::string str = "Hello, World!";
std::string sub = str.substr(7, 5);  // 从位置7开始,提取5个字符
std::cout << sub << std::endl;  // 输出"World"
  • compare():

compare()用于比较两个字符串。它返回一个整数值:

  • 0:字符串相等
  • 小于0:当前字符串小于目标字符串
  • 大于0:当前字符串大于目标字符串
cpp 复制代码
std::string str1 = "Hello";
std::string str2 = "World";
if (str1.compare(str2) == 0) {
    std::cout << "Strings are equal." << std::endl;
} else {
    std::cout << "Strings are not equal." << std::endl;
}

1.3 性能方面

  • 内存管理:std::string会动态分配内存,且在字符串增长时可能会重新分配。为了避免不必要的内存分配,可以使用reserve()函数来提前分配内存。
  • 拷贝和赋值:std::string在赋值和拷贝时使用浅拷贝机制(通过引用计数实现),因此它通常比C风格的字符数组更高效。
相关推荐
橘子海全栈攻城狮10 分钟前
【最新源码】基于SpringBoot + Vue的超市管理系统的设计与实现D002
java·开发语言·vue.js·spring boot·后端·spring
在水一缸17 分钟前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
-银雾鸢尾-24 分钟前
C#中Object类内的方法
开发语言·c#
2401_8414956430 分钟前
【数据结构】B*树
数据结构·c++·b树·算法·删除·插入·三分分裂
浮江雾41 分钟前
Flutter第十节-----Flutter布局与组件全解析
android·开发语言·前端·学习·flutter·入门
爱喝水的鱼丶41 分钟前
SAP-ABAP:ALV跨版本兼容指南——适配ECC与S4 HANA系统的ALV开发注意事项
开发语言·性能优化·sap·abap·经验交流
布朗克1681 小时前
Go 入门到精通-27-泛型编程
开发语言·golang·xcode·泛型编程
cui_ruicheng1 小时前
Python从入门到实战(十五):文件操作与目录管理
开发语言·python
Roy_Sashulin1 小时前
灵杉Java编程平台第一章:安装
java·开发语言
名字还没想好☜1 小时前
Go 用 errgroup 管理并发子任务:错误收敛、取消传播与限流
开发语言·后端·golang·go·并发