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

【C++】 string的了解及使用

标准库中的string类

在使用string类时,必须包含#include头文件以及using namespace std;

string类的常用接口说明

C++中string为我们提供了丰富的接口来供我们使用 – string接口文档
在这里插入图片描述
这里我们只介绍一些常见的接口

string类对象的常见构造

在这里插入图片描述

#include <iostream>
using namespace std;int main()
{
;cout << string() << endl;string s1("hello");cout << s1 << endl;string s2(5, 'x');cout << s2 << endl;string s3(s1);cout << s3 << endl;return 0;
}

在这里插入图片描述

string类对象的容量操作

在这里插入图片描述

1.size 和 length

在string类中我们通过size()和length()来返回字符串的有效字符的长度

int main()
{string s1("hello");cout << s1.size() << " " << s1.length();return 0;
}
2.max_size( )

max_size() 返回的是字符串的最大长度,不同位数系统字符串最大长度还不同,但一般字符串都开不了这么大的空间
32位系统:

int main()
{string s1("ssss");cout << s1.max_size() << endl;return 0;
}

在这里插入图片描述

capacity

capacity()返回的是字符串的空间大小,其和字符串的有效长度并不相同,及为字符串可容纳的最大长度,到了最大长度就会扩容

int main()
{string s1("ssss");cout << s1.size() << " " << s1.capacity();return 0;
}

在这里插入图片描述
在这里插入图片描述

reserve

在这里插入图片描述
reserve()当字符串容量不足时,reserve( )会对字符串进行扩容,及size == capacity

vs和linux(g++)下字符串扩容和缩容机制
int main()
{string s;size_t sz = s.capacity();cout << "capacity:" << sz << endl;cout << "making s grow:" << endl;for (int i = 0; i < 100; i++){s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed:" << sz << endl;}}//在linux上g++和vs上的capacity都是不计算/0//如何扩容c++标准并没有规定return 0;
}
  • VS扩容:

在这里插入图片描述
这里的capacity要比实际上的capacity要小1,因为在VS上capacity并没有将 ‘\0’ 计算进来

  • 为什么初始字符串容量大小为15呢?
  • VS中string的结构
    string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义
    string中字符串的存储空间:
    当字符串长度小于16时,使用内部固定的字符数组来存放
    当字符串长度大于等于16时,从堆上开辟空间
    在这里插入图片描述
    还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量
    最后:还有一个指针做一些其他事情。
    故总共占16+4+4+4=28个字节。
    在这里插入图片描述
int main()
{string s;size_t sz = s.capacity();cout << "making s grow:" << endl;for (int i = 0; i < 100; i++){s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed:" << sz << endl;}}//在linux上g++和vs上的capacity都是不计算/0//如何扩容c++标准并没有规定return 0;
}
  • Linux扩容
    在这里插入图片描述
int main()
{string s("111111111111111");//string中有一个16个字节的buff数组cout << s.capacity() << endl;s.reserve(100);cout << s.capacity() << endl;s.reserve(20);cout << s.capacity() << endl;//vs不会缩容,而linuxg++会缩容return 0;
}

VS缩容:
VS下不会进行缩容
在这里插入图片描述
Linux缩容
在这里插入图片描述

resize( )

将有效字符的个数改成n个
在这里插入图片描述

int main()
{string s = "11111111";s.resize(5, '0');//不会进行缩容cout << s.capacity() << " " << s.size() << endl;s.resize(10, '0');cout << s.capacity() << " " << s.size() << endl;return 0;
}

在这里插入图片描述

int main()
{string s = "11111111";s.resize(5, '0');//不会进行缩容cout << s << endl;s.resize(10, '0');cout << s << endl;return 0;
}
  • 当 resize中n > size ,则会对其进行插入补充字符C,如果没有参数C,就回默认补充字符 ‘\0’ ,

在这里插入图片描述

string迭代器

迭代器(Iterator)是一种设计模式,它提供了一种方法顺序访问一个集合对象中的各个元素,而无需暴露该对象的内部表示。
在这里插入图片描述

begin 和 end

在这里插入图片描述

begin指向字符串开始位置,end指向字符串最后一个字符的下一个位置

rbegin 和 rend

在这里插入图片描述

const 迭代器
int main()
{const string s2("1111111");string::const_iterator it = s2.begin();
}

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

对于string类的遍历,我们有几种方式来进行遍历:

  • 调用at进行访问
int main()
{string s1("hello world");for (size_t i = 0; i < s1.size(); i++){cout << s1.at(i) << " ";}return 0;
}

at 与 下标加[ ] 进行访问的区别就是越界时 at可以捕获异常,而 [] 不可以捕获异常,直接就回报错

int main()
{string s("sssssss");try{//s[11];//越界,没有商量的余地s.at(11);//有商量的余地,可以捕获异常}catch (const exception& e){cout << e.what() << endl;}return 0;
}

在这里插入图片描述

int main()
{string s("sssssss");try{s[11];//越界,没有商量的余地}catch (const exception& e){cout << e.what() << endl;}return 0;
}

在这里插入图片描述

  • 下标加 [] 进行访问遍历(及通过operator[ ]进行访问)
    在这里插入图片描述
int main()
{string s1("hello world");for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}return 0;
}
  • 范围for进行访问
int main()
{string s1("hello world");for (auto e : s1){cout << e << " ";}return 0;
}
  • 迭代器进行访问
int main()
{string::iterator it = s1.begin();while (it != s1.end()){cout << *it << endl;it++;}return 0;
}
int main()
{string s1("hello world");string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){*rit = 'x';cout << *rit << " ";rit++;}const string s2("hello world");string::const_iterator it = s2.begin();while (it != s2.end()){cout << *it << " ";it++;}
}

在这里插入图片描述

string类对象的修改操作

在这里插入图片描述

push_back 和 append 和 operator+=
int main()
{string s1 = "hello world";s1.push_back('x');//在字符串后添加一个字符cout << s1 << endl;s1.append("xxxxx");//在字符串后添加一床字符cout << s1 << endl;s1 += "myself";//在字符串后添加字符串cout << s1 << endl;
}

在这里插入图片描述
下面是上面函数的其他函数重载
在这里插入图片描述
在这里插入图片描述

assign
int main()
{string s("12344512233");s.assign("111");cout << s << endl;
}

在这里插入图片描述
在这里插入图片描述

insert 和 erase
	string s("122222");s.insert(s.begin(), 'y');cout << s << endl;s.insert(6,"xxxx");cout << s << endl;string s1("mmm");s.insert(s.begin(), s1.begin(), s1.end());cout << s << endl; //慎用,效率不高s.erase(1,3);cout << s << endl;s.erase(s.begin());cout << s << endl;s.erase(s.begin(), s.end());cout << s << endl;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

replace
int main()
{string s("1111111");s.replace(2, 6, "s");cout << s << endl;
}

在这里插入图片描述
在这里插入图片描述

swap

在这里插入图片描述

int main()
{string s("1111111");string s1("sss");s.swap(s1);cout << s << " " << s1;
}

在这里插入图片描述

pop_back
int main()
{string s("1111111s");s.pop_back();cout << s;
}

在这里插入图片描述

string类对象的查找操作

在这里插入图片描述

int main()
{string str = "We think in generalities, but we live in details.";size_t pos = str.find("live");     cout << pos;return 0;
}

在这里插入图片描述

string类对象的一些其他操作(感兴趣的可以去了解)

在这里插入图片描述

http://www.lryc.cn/news/470515.html

相关文章:

  • 【K8S】kubernetes-dashboard.yaml
  • 远程root用户访问服务器中的MySQL8
  • 解释一下 Java 中的静态变量(Static Variable)和静态方法(Static Method)?
  • 【Linux】————磁盘与文件系统
  • 平衡控制——直立环——速度环
  • 面试简要介绍hashMap
  • HTTPS如何实现加密以及SSL/TSL加密的详细过程
  • Golang | Leetcode Golang题解之第516题最长回文子序列
  • (done) 什么 RPC 协议? remote procedure call 远程调用协议
  • PCL 基于Ransac提取误匹配点对
  • 光速写作 2.0.5 | 专注AI写作,海量素材库
  • 【已解决,含泪总结】非root权限在服务器上配置python和torch环境,代码最终成功训练(一)
  • 公安基础知识-通哥
  • Python画图|极坐标下的散点图动态输出
  • 揭开MySQL并发中的“死锁”之谜:从原理到解决方案的深度解析
  • 【论文阅读】Reliable, Adaptable, and Attributable Language Models with Retrieval
  • A-Frame负责人Diego Marcos分享WebXR与开源AI的未来
  • 【STM32-HAL库】火焰传感器(STM32F407ZGT6)(附带工程下载链接)
  • git merge没有生成合并提交
  • 算法题总结(十九)——图论
  • android studio编译错误提示无法下载仓库
  • 基于SpringBoot的时装购物系统【源码】+【论文】
  • 自动化结账测试:使用 Playwright确保电商支付流程的无缝体验【nodejs]
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-25
  • 【读书笔记-《网络是怎样连接的》- 5】Chapter2_4-网卡的工作过程
  • qt QOperatingSystemVersion详解
  • openpnp - 解决“底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题“
  • Python字幕滚动:为视频添加专业级动态效果!
  • Linux 系统中,将网络配置从 DHCP 改为静态 IP的几种方法
  • 【jellyfin】解决Edge 浏览器播放 jellyfin 的 hevc/h265 视频“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”错误