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

C++---string类常见接口

介绍

 string类详情===>>>https://cplusplus.com/reference/string/string/?kw=string

1. string是表示字符串的字符串类(感觉就像一个动态的字符数组)
2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
4. 不能操作多字节或者变长字符的序列。
在使用string类时,必须包含#include头文件以及using namespace std;

string类的常用接口说明

1 string类常用构造函数

1.1 string()

定义一个空字符串,直接使用就行。

#include <iostream>
#include <string>
using namespace std;
int main()
{string s1;return 0;
}

1.2 string(const char* s)

#include <iostream>
#include <string>
using namespace std;
int main()
{const char *ch="hello world";string s1("hello world");string s2(ch);return 0;
}

1.3 string(size_t n, char c)

#include <iostream>
#include <string>
using namespace std;
int main()
{string s(3, 'a'); //3个a字符cout << s;return 0;
}

1.4 string(const string&s)

#include <iostream>
#include <string>
using namespace std;
int main()
{string s(3, 'a');string s1 = s;//定义变量时候的=就是拷贝构造cout << s;string s2;s2 = s;//定义完了之和的=是调用的运算符重载operator=()return 0;
}

2 string类对象的容量操作

2.1 size/length

	string s1("hello world");string s2("hello");cout << s1.size() << endl; //11cout << s2.length() << endl; //5//size和length本质没啥区别,只是谁先被创造出来的差别而已

2.2 capacity

string s1("hello world");
cout << s1.capacity() << endl; //15//实际容量一般比capacity多一个,用于存储'\0'

capacity与size的区别:capacity是容量,表示总共最多能装多少个字符,而size是表示字符串的有效字符的数量,则capacity>=size。

在实际扩容中,为了提高效率,capacity的增长是按照一定比率增长的,在VS中,大概为1.5倍增长。

2.3 clear

string s1("hello world");
cout << s1  << endl; //hello world
s1.clear();
cout << s1  << endl; //空

2.4 reserve

string s;//创建一个s空字符串
s.reserve(100);//提前为 s 开辟100个空间
cout<<s.size()<<endl;//0
cout << s.capacity() <<endl;//111

 reserve只会开辟空间,并不会改变字符串有效字符内容。reserve开辟的空间要比string底层空间要大,如果传入参数小于string底层空间大小的话则为无效开辟。

2.5 resize

两种方式:

resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字
符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的
元素空间。

注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大
小,如果是将元素个数减少,底层空间总大小不变。

3 string类对象的访问和遍历

3.1 operator[] 

for (int i = 0; i < s3.size(); i++){s3[i] += 2;}

[]的运算符重载,可以直接将string类对象当数组一样用下标访问。

3.2 begin+ end

//迭代器string::iterator it = s3.begin();while (it != s3.end())//写{*it -= 2;it++;}it = s3.begin();//置为起点while (it != s3.end())//读   end为数组末尾的下一个位置{cout << *it << " ";it++;}

begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器

3.3 rbegin + rend

string s1("hello world");string::reverse_iterator  rit = s1.rbegin();while (rit != s1.rend()){cout << *rit << " ";rit++;}cout << endl;

4 string类对象的修改操作

4.1 push_back

string s;
s.push_back('c');

在字符串后插入c

4.2 append

string s;
s.append("123");

在字符串后追加一个字符串

4.3 operator+=

string s;
s += '8';
s += "sda";
//s: 8sda

在字符串后追加字符串str

在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

4.4 insert 

string s("hello world");
s.insert(s.begin(), 's');
//s: shello world

在下标为pos之前插入字符串。

4.5 erase

string s("xxxhello world");
s.erase(0,3);//前面的 0 是位置,后面的3是需要删除的字符个数
cout << s << endl; //hello world

从某个位置开始删除几个字符,如果字符不够删,则有多少删多少

未完待续.....

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL 8.0.24 表 ‘/tmp/#sql1_f519f_7‘ 已满
  • Linux常见操作指令
  • VScode:前端开发中的常用快捷键和技巧
  • Comsol 点激励条件下薄板声辐射响应
  • C#游戏服务器开发框架设计与架构详解
  • [数据集][目标检测]机油泄漏检测数据集VOC+YOLO格式43张1类别
  • 论文翻译:arxiv-2024 Benchmarking Benchmark Leakage in Large Language Models
  • 那些你不知道的3个comfyui小技巧,分享给大家!
  • JAVA实习生(月薪3K-5K)应该具备哪些知识、能力
  • 计算机网络 ---如何寻找目标计算机
  • 膨胀腐蚀操作opencv dilate膨胀白膨胀,erode腐蚀是黑吃白。主要针对二值图
  • 0.3 学习Stm32经历过的磨难
  • 高保真+通用!视频扩散模型加持,稀疏视图重建任意场景!清华港科大发布ReconX
  • 【算法】分治 · 归并
  • 搜维尔科技:SenseGlove触觉反馈数据手套为人形机器人遥操作提供精确的控制和交互方案
  • ECS应用管理最佳实践
  • JavaScript异步流程控制的前世今生
  • Just for fun——迅速写完快速排序
  • LeetCode29.两数相除 JavaScript
  • React Transition Group -- Transition 组件
  • Redis 懒删除(lazy free)简史
  • TypeScript迭代器
  • vue的全局变量和全局拦截请求器
  • yii2中session跨域名的问题
  • Yii源码解读-服务定位器(Service Locator)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 动态魔术使用DBMS_SQL
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 前端代码风格自动化系列(二)之Commitlint
  • 日剧·日综资源集合(建议收藏)
  • 实习面试笔记
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 我的zsh配置, 2019最新方案
  • 线性表及其算法(java实现)
  • 移动端唤起键盘时取消position:fixed定位
  • 用Canvas画一棵二叉树
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # centos7下FFmpeg环境部署记录
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (BFS)hdoj2377-Bus Pass
  • (poj1.3.2)1791(构造法模拟)
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)程序员疫苗:代码注入
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET LINQ 通常分 Syntax Query 和Syntax Method