基于算法竞赛的c++编程(18)string类细节问题

本节是string类细节问题

构造与初始化

std::string有多种构造函数:

cpp 复制代码
std::string s1;                // 默认构造,空字符串
std::string s2("Hello");       // 从C字符串构造
std::string s3(s2);            // 拷贝构造
std::string s4(5, 'a');        // 填充构造,结果为"aaaaa"
std::string s5(s2, 1, 3);      // 子串构造,从索引1开始取3个字符,结果为"ell"

访问字符

可用[]或at()访问字符:

cpp 复制代码
std::string s = "Hello";
char c1 = s[1];      // 'e',不检查边界
char c2 = s.at(1);   // 'e',抛出std::out_of_range异常

修改操作

追加、插入、删除等操作:

cpp 复制代码
s += " World";       // 追加,s变为"Hello World"
s.append("!");       // 追加,s变为"Hello World!"
s.insert(5, ",");    // 插入,s变为"Hello, World!"
s.erase(5, 1);       // 删除,s变为"Hello World!"

查找与替换

查找子串或字符:

cpp 复制代码
size_t pos = s.find("World");  // 返回首次出现的位置(6)
if (pos != std::string::npos) {
    s.replace(pos, 5, "C++");  // 替换为"C++",s变为"Hello C++!"
}

容量与大小

cpp 复制代码
s.size();     // 当前字符数(9)
s.empty();    // 是否为空
s.resize(10); // 调整大小,不足时填充'\0'
s.capacity(); // 当前分配的内存容量

字符串比较

直接使用比较运算符:

cpp 复制代码
std::string a = "apple", b = "banana";
if (a < b) { /* ... */ }  // 字典序比较

转换与C字符串

转换为C风格字符串:

cpp 复制代码
const char* cstr = s.c_str();  // 返回const char*
char* buf = new char[s.size() + 1];
s.copy(buf, s.size());         // 拷贝到缓冲区

迭代器支持

支持STL迭代器:

cpp 复制代码
for (auto it = s.begin(); it != s.end(); ++it) {
    std::cout << *it;
}
for (char ch : s) { /* ... */ }  // 范围for循环

注意:std::string管理的内存是动态分配的,无需手动释放。C++17后新增了std::string_view用于非占有式字符串视图。

相关推荐
企业数字化笔记2 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!2 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小成202303202655 小时前
C++~07补充
开发语言·c++
小郎君6585 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧5 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
hold?fish:palm5 小时前
40 二叉树的直径
c++·leetcode
Shimeri6 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
解决小子6 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
Evand J6 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波