C++ string详解:从底层原理到常用操作全面掌握std::string
1. 什么是string在C中字符串有两种表示方式C风格字符串C-style stringC标准库提供的string类C语言中使用字符数组表示字符串char str[] hello;本质上h e l l o \0字符串末尾需要一个\0表示结束。但是C风格字符串存在很多问题需要手动管理空间容易发生越界字符串拼接复杂容易造成内存泄漏例如char str1[20] hello; char str2[] world; strcat(str1, str2);程序员必须提前考虑数组空间是否足够。C提供了std::string类解决这些问题。使用#include iostream #include string using namespace std; int main() { string s hello; cout s endl; return 0; }输出hellostring本质上是一个管理字符数组的类。它帮我们完成动态扩容内存释放字符串拼接查找替换长度管理2. string的底层结构string内部大致包含class string { private: char* _str; // 指向字符串空间 size_t _size; // 当前有效字符数量 size_t _capacity; // 容量 };例如string s hello;内存类似_str | v ------------------- | h | e | l | l | o | \0 | ------------------- size 5 capacity 5注意size表示有效字符数量。capacity表示当前申请的空间大小。例如string shello; couts.size()endl; couts.capacity()endl;可能输出5 15说明虽然字符串只有5个字符但是内部可能提前开辟15个空间。3. string的构造函数3.1 默认构造创建空字符串string s;相当于3.2 使用字符串初始化string s(hello);或者string shello;3.3 拷贝构造string s1hello; string s2(s1);结果s1: hello s2: hello两个对象内容一样。3.4 创建n个相同字符格式string(size_t n,char c);例如string s(5,a); couts;输出aaaaa4. string容量相关接口size()返回字符串长度string shello; couts.size();输出5length()功能和size一样couts.length();推荐size()因为STL容器统一使用size。capacity()查看容量string shello; couts.capacity();empty()判断是否为空string s; if(s.empty()) { cout空字符串; }clear()清空字符串string shello; s.clear(); couts;结果注意clear只是清除内容。不会释放空间。例如string shello; couts.capacity(); s.clear(); couts.capacity();容量通常不变。5. string访问字符operator[]最常用string shello; couts[0];输出h修改s[0]H; couts;结果Helloat()和[]类似couts.at(0);区别[]越界不会检查。at():越界会抛异常。例如string shello; couts.at(100);会产生out_of_range异常6. string遍历方法1for循环string shello; for(size_t i0;is.size();i) { couts[i] ; }输出h e l l o方法2范围forC11支持for(auto ch:s) { coutch; }方法3迭代器string shello; string::iterator its.begin(); while(it!s.end()) { cout*it; it; }7. string拼接operator最简单string s1hello; string s2world; string s3s1s2; couts3;输出helloworldappend()追加字符串string shello; s.append( world); couts;输出hello worldpush_back()尾插一个字符string shello; s.push_back(!); couts;输出hello!注意push_back只能插入一个字符。错误s.push_back(abc);8. string插入insert()格式insert(pos,string)例如string shello; s.insert(5, world); couts;结果hello world9. string删除erase()删除指定位置string shello; s.erase(1,2); couts;过程删除e l结果hlo格式erase(pos,len)删除最后一个字符s.pop_back();例如string shello; s.pop_back(); couts;输出hell10. string查找find()查找字符串string shello world; size_t poss.find(world); coutpos;输出6如果找不到返回string::npos例如if(s.find(abc)string::npos) { cout不存在; }rfind()从后往前查找string shello hello; couts.rfind(hello);输出611. string替换replace()格式replace(pos,len,string)例如string shello; s.replace(0,5,world); couts;结果world12. string截取子串substr()格式substr(pos,len)例如string shello world; string subs.substr(6,5); coutsub;输出world13. string和C字符串转换string转char*不能直接string shello; char* ps;错误。使用s.c_str();例如string shello; printf(%s,s.c_str());char*转string直接char str[]hello; string sstr;即可。14. string的扩容机制当字符串空间不足时旧空间 | v [hello] 插入: [hello world] 重新申请更大空间 复制数据 释放旧空间类似vector。扩容通常是1.5倍 或者 2倍不同编译器实现不同。例如string s; for(int i0;i100;i) { s.push_back(a); couts.capacity()endl; }可以观察容量变化。15. string为什么比char数组方便char数组char a[100]; strcpy(a,hello); strcat(a,world);问题容易越界不知道长度需要手动管理stringstring shello; sworld;优势自动管理内存接口丰富安全性更高支持STL算法16. string使用注意事项1. size返回unsigned类型例如错误for(int is.size()-1;i0;i--)因为size_t是无符号类型可能导致死循环。推荐for(int i(int)s.size()-1;i0;i--)2. 修改字符串不能越界错误string shello; s[10]a;属于非法访问。3. 不要频繁拼接大字符串例如string s; for(int i0;i100000;i) { shello; }可能频繁扩容。优化s.reserve(500000);提前开空间。17. reserve和resize区别这是string里面非常重要的知识。reserve()改变容量string s; s.reserve(100);结果capacity100 size0不会初始化字符。resize()改变有效字符数量string s; s.resize(10);结果size10里面产生10个\0。区别接口改变是否初始化reserve容量否resize大小是18. string总结功能接口长度size()容量capacity()清空clear()判断为空empty()访问字符[]、at()尾插字符push_back()删除尾字符pop_back()拼接、append()插入insert()删除erase()查找find()替换replace()截取substr()预留空间reserve()调整大小resize()总结std::string是C中最常用的字符串类它本质上是一个动态管理字符数组的类。学习string不仅是学习几个接口更重要的是理解string如何管理内存size和capacity区别扩容机制深浅拷贝问题STL容器设计思想掌握string以后可以为后续学习vectorlistmapunordered_mapSTL算法打下非常好的基础。一句话总结C语言告诉我们字符串是什么C string告诉我们如何优雅、安全、高效地管理字符串。

相关新闻

C++实战指南:从核心价值到现代工具链,探索高性能编程的未来

C++实战指南:从核心价值到现代工具链,探索高性能编程的未来

1. 从“老兵”视角看C的当下与未来最近在社区里,看到不少关于“C是否过时”、“学C还有没有前途”的讨论。作为一个从大学就开始摸C,在工业界用它写过嵌入式驱动、游戏引擎、高频交易系统,也用它调过无数“段错误”和“内存泄漏”的老兵&…

2026/7/29 3:45:45 阅读更多 →
网络学习系列之二:交换机、集线器、广播域与交换技术详解

网络学习系列之二:交换机、集线器、广播域与交换技术详解

1. 引言在局域网(LAN)的构建与设计中,集线器(Hub)、交换机(Switch)以及广播域(Broadcast Domain)是三个非常核心的概念。理解它们的工作原理与区别,是掌握现代…

2026/7/29 3:44:45 阅读更多 →
AI论文写作工具评测与学术伦理指南

AI论文写作工具评测与学术伦理指南

1. AI论文写作工具的市场需求解析 学术论文写作一直是困扰研究人员的痛点问题。根据Nature最新调查显示,超过78%的博士生表示在论文写作阶段遭遇严重瓶颈,平均每篇论文要经历23次修改。传统写作流程中,文献综述耗时占比高达40%,而…

2026/7/29 3:44:45 阅读更多 →

最新新闻

打破围墙·智联云端|院内MDT多学科会诊协同方案全解析

打破围墙·智联云端|院内MDT多学科会诊协同方案全解析

一、背景:从"单科作战"到"多学科协同"的必然之变随着医学专科持续精细化划分,单一学科诊疗思路难以满足复杂疑难疾病的救治需求,多学科联合诊疗(MDT) 已经成为优化疑难重症诊疗方案、持续提升医疗…

2026/7/29 4:24:58 阅读更多 →
概率路图(PRM)算法原理与Python实现:机器人路径规划核心

概率路图(PRM)算法原理与Python实现:机器人路径规划核心

1. 项目缘起:当自动驾驶车面对“迷宫”时,我们为何需要PRM?想象一下,你刚拿到驾照,被要求开车穿过一个完全陌生、堆满了随机障碍物的巨型停车场。没有地图,没有车道线,你只能看到车周围一小片区…

2026/7/29 4:24:58 阅读更多 →
NumPy数组创建全攻略:从基础函数到性能优化实战

NumPy数组创建全攻略:从基础函数到性能优化实战

1. 从零开始:为什么数组是数据处理的基石如果你刚开始接触Python数据分析或者科学计算,第一个绕不开的库大概率就是Numpy。而学习Numpy,第一个要啃下的硬骨头,就是“创建数组”。很多人可能会觉得,这不就是几个函数调用…

2026/7/29 4:24:58 阅读更多 →
Python 3.8+环境搭建与AI大模型集成实战全流程解析

Python 3.8+环境搭建与AI大模型集成实战全流程解析

最近很多同学在后台留言,说想要一套真正系统化的PythonAI实战教程,既能打好Python基础,又能上手AI大模型应用。网上资料虽然多,但往往知识点零散,缺乏从环境搭建到项目落地的完整闭环。本文将围绕Python 3.8环境&#…

2026/7/29 4:24:58 阅读更多 →
AI将在所有数学证明领域

AI将在所有数学证明领域

今年的菲尔兹奖颁发后,发生了一件令人震惊的事。 和王虹、邓煜一起获奖的多伦多大学教授Jacob Tsimerman,居然紧接着宣布加入OpenAI,转行从事AI安全研究。 他的理由是: 2年之内,AI将在所有数学证明领域,…

2026/7/29 4:24:58 阅读更多 →
C++命令行解析库cmdline:轻量级工具开发利器

C++命令行解析库cmdline:轻量级工具开发利器

1. 项目概述:为什么我们需要一个C命令行解析器? 如果你用C写过一些需要从终端接收参数的小工具,比如一个文件处理器、一个网络测试客户端,或者一个数据处理脚本,那你肯定对 argc 和 argv 这两个老朋友又爱又恨。爱…

2026/7/29 4:23:58 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻