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

C++string类(2)

3.string类对象的访问及遍历操作

函数名称功能说明
operator[] (重 点)返回pos位置的字符,const string类对象调用
begin+endbegin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin+rendrbegin获取最后一个字符的迭代器 + rend获取第一个字符上一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式
void test1()
{string s1 = "gxlgxlgxlgxlgxl";cout << s1[0] << s1[1] << s1[2] << endl;
}void test2()
{string s1 = "gxlgxlgxlgxlgxl";//string::iterator it = s1.begin();auto begin = s1.begin();auto end = s1.end();cout << *begin << endl;cout << *(end - 1) << endl;//end指向最后一个字符的下一个位置,这里减1取最后一个位置while (begin != end){cout << *begin << endl;++begin;}}
void test3()
{string s1 = "gxlgxlgxlgxlgxl";auto rbegin = s1.rbegin();auto  rend = s1.rend();cout << *(rend - 1) << endl;//rend指向第一个字符的前一个位置,//但是在这个rend中我们想取第一个位置的字符要减1cout << *rbegin << endl;//rebegin指向最后一个字符while (rbegin != rend){cout << *rbegin << endl;++rbegin;}//输出为从字符串从后往前访问,即rbegin+1 是在从后往前走,//这也解释为何访问第一个位置要rend-1
}void test4()
{string s1 = "gxlgxlgxlgxlgxl";for (auto ch : s1){cout << ch << endl;}
}
int main()
{test1();test2();test3();test4();return 0;
}

4.string类对象的修改操作

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+= (重 点)在字符串后追加字符串str
c_str(重点)返回C格式字符串
find + npos(重 点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的 位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

5.string类非成员函数

函数功能说明
operator>> (重点)输入运算符重载
operator<< (重点)输出运算符重载
getline (重点)获取一行字符串
relational operators (重点)大小比较
operator+尽量少用,因为传值返回,导致深拷贝效率低

上面的几个接口大家了解一下,下面的OJ题目中会有一些体现他们的使用。string类中还有一些其他的操作,这里不一一列举,大家在需要用到时不明白了查文档即可。

6.vs和g++下string结构的说明

注意:下述结构是在32位平台下进行验证,32位平台下指针占4个字节。

vs下string的结构

string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义 string中字符串的存储空间:

当字符串长度小于16时,使用内部固定的字符数组来存放 。

当字符串长度大于等于16时,从堆上开辟空间。

union _Bxty
{ // storage for small buffer or pointer to larger onevalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;

这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。

其次:还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量

最后:还有一个指针做一些其他事情。

故总共占16+4+4+4=28个字节。

在这里插入图片描述

g++下string的结构

G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:

1)空间总大小

2)字符串有效长度

3)引用计数

struct _Rep_base
{size_type               _M_length;size_type               _M_capacity;_Atomic_word            _M_refcount;
};

指向堆空间的指针,用来存储字符串。

http://www.dtcms.com/a/287930.html

相关文章:

  • fclose 函数的概念和使用案例
  • GEE:批量处理和下载SoilGrids 250m v2.0
  • 区块链可投会议CCF A--ICDE 2026 截止10.27 附录用率
  • 【科研绘图系列】R语言绘制显著性标记的热图
  • 数学建模:运筹优化类问题
  • 3.5软件开发活动[2-系统设计]面向对象设计-UML统一开发过程
  • 短视频矩阵的未来前景:机遇无限,挑战并存
  • Tomcat 生产 40 条军规:容量规划、调优、故障演练与安全加固
  • Linux Ubuntu安装教程|附安装文件➕安装教程
  • 尚庭公寓-----day2 业务功能实现
  • PHP 就业核心技能速查手册
  • Delphi XE 自带了 Base64编码解码
  • 前端知识回顾-登录界面
  • 从“数字土著”到“数据公民”:K-12数据伦理课程的设计、实施与成效追踪研究
  • 开启你的专属智能时代:枫清科技个人智能体限时体验计划上线!
  • 简单易懂,段页式管理
  • 【leetcode100】寻找重复数
  • Codeforces Round 1037 (Div. 3)(补题)
  • 数据结构与算法之美:拓扑排序
  • Kimi K2 日调用量超100亿 token,API 价格低于 Claude 系列模型
  • 正则表达式概述
  • 垃圾回收(GC)
  • 机器学习漫画小抄 - 彩图版
  • Linux内核设计与实现 - 第6章 内核数据结构
  • 编程思想:程序自身的模型/函数模型硬件标准如何实现
  • MCP 协议分析 二 Sampling
  • synchronized锁升级机制
  • 100条常用SQL语句
  • Spring AI 1.0版本 + 千问大模型之文本对话
  • ReentrantLock和synchronized的区别