C++ string(二)

news2024/9/28 1:15:26

目录

  • size()
  • 三种遍历string的方式
  • auto
  • 迭代器
  • capacity

size()

size:获取它有多少个字符
size_t size() const;

int main()
{
	string s1("hello world");

	size_t ret = s1.size();
	//计算的是\0前面的字符个数
	cout << ret << endl;//11

	return 0;
}

三种遍历string的方式

1.下标 + [ ]
仅支持数组不支持链表

int main()
{
	string s1 = ("hello world");
	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << " ";
	}
	//h e l l o   w o r l d
	cout << endl;

	return 0;
}

2.迭代器
迭代器(iterator):像指针一样的东西,不一定是指针
迭代器可以用来访问所有容器(数据结构,链表,树)

it不一定是指针,如果不是指针,*和++会进行重载
begin():返回开始位置的迭代器
end():返回最后一个有效字符的下一个位置
在这里插入图片描述

int main()
{
  string::iterator it = s1.begin();
  while (it != s1.end())
 {
	cout << *it << " ";
	++it;
 }
 cout << endl;
 return 0;
}

3.范围for
C++11提供的范围for
可以支持所有的容器
自动从s1中取每个值给ch变量,auto自动推导类型
auto:自动赋值,自动迭代,自动判断结束

int main()
{
  for (auto ch : s1)
  {
	cout << ch << " ";
  }
 cout << endl;
 return 0;
}

编译后自动替代为迭代器,底层都是迭代器,范围for的优点是更加方便

<1>.for(auto ch : s)
拷贝不影响string本身
<2>.for(auto& ch : s)
引用会影响string本身

auto

1.auto 可以用来简化代码(类型)
可以用auto来替换长类型

<3>.string::iterator it = s2.begin();
string::iterator:是类型
<3>可以写成
auto it = s2.begin();

2.auto推导类型
根据函数的返回值或右边的类型推导
auto e;(x)

auto c = 'a';
cout << typeid(c).name() << endl;
//char 
c:可以是类型或者是对象都打印出类型

auto arrary[] = {4,5,6};
auto 不能定义数组

auto a = 1,b = 2(v)
auto a = 3,b = 3.1(x)

auto 不能做参数
void func2(auto a) (x)
{}

auto 可以做返回值,但要谨慎使用
auto func3()
{
  return 1;
}
谨慎使用,如果多层返回
int func1()
{
  return 10;
}
auto func2()
{
  return func1();
}
auto func3()
{
  return func2();
}

int main()
{
  auto ret = func3();
  return 0;
}

范围for:遍历数组和容器只是为了方便
1.用于容器的使用
2.用于数组的使用可以简化代码

for(auto& e : array)
{
   //改变了array中的值,引用
   e *= 2;
}
for(auto e : array)
{
   e:变量
   array:对象
   cout << e << " " << endl;
   //拷贝不改变原数组的内容
}

底层替换成了指针,数组没有迭代器
auto 在预处理阶段不做处理,在编译阶段处理
预处理阶段:比如宏,条件编译,头文件包含
编译阶段:auto,模版

auto y = &x;
//右边可以是任何类型
auto* z = &x;
//右边必须是指针(地址),因为左边是指针类型

迭代器

迭代器分为正向迭代器反向迭代器

正向迭代器:iterator 正向走(数组向右走)
反向迭代器:reverse_ iterator 反向走(数组向左走)

反向迭代器
在这里插入图片描述
这里可以倒着打印数据

int main()
{
  	string s1 = ("hello world");

	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
	// d l r o w   h e l l 0

	return 0;
}

++肯定封装进一个类中了,不然++不可能倒着走
树,链表倒着遍历必须用这个
下标+[ ]只能用于数组

四种迭代器:
1.普通迭代器(iterator begin() ):可读可写
2.const 迭代器(const_iterator begin() const; ):只能读不能写
const迭代器类似于const int* 只能改变指针的指向,不能改变指向的内容
3.反向迭代器(reverse_iterator rbegin(); )
4.const 反向迭代器(const_reverse_iterator() const; )

int* const 只能改变指向的内容,不能改变指向

capacity

1.size() -> 计算大小,具有通用性
2.length() -> 计算string的大小,具有局限性,不能计算树的大小
length 是string中的size,size比较好用,length是在STL之前就存在的,要向前兼容

string s2("hello world");
cout << s2.length() << endl;
//11
cout << s2.size() << endl;
//11

3.max_size:可以存储的最大的大小(size)
max_size基本不使用

string s2("hello world");
cout << s2.max_size() << endl;
整型的最大值,不同平台、不同容器也不同

4.capacity:空间大小
打印出的是有效字符的个数,不把\0的空间显示出来

string s2("hello world");
cout << s2.capacity() << endl;//15

VS中有数组int buff[16]的存在,第一次是两倍的扩容,后面是1.5倍扩容,但是整体认为扩容2倍

char _buff[16];
char* _arr;
int _size;
int _capacity;

第一次开不超过16字节的空间在buff上,不在堆上,超过buff的空间,会把buff的空间不要,在堆上重新开一块空间,把原数据拷贝过去,但是buff的空间还是存在的

5.reserve:保留,存储

void reserve (size_t n = 0);
会开好比n大的空间( >= n),开的是有效的字符的空间,不包含 \0,提前开好空间

s.reserve(100);
要开100,至少要101的空间
capacity不含\0,底层要比capacity多一个空间
reverse:提前开空间,避免扩容,提高效率

reverse不能改变size(大小)和内容
比如:
size(长度) 10 capacity(空间) 20
1.n < 10
2.10 < n < 20
3.n > 20 扩容
会不会缩容呢?
1 和 2 VS不缩容 : 空间换时间
1 和 2 g++(Linux)缩容 : 珍惜空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】Centos 7 安装 Redis 5.0

目录 Redis重大版本 Redis 2.6 Redis 2.8 Redis 3.0 Redis 3.2 Redis 4.0 Redis 5.0 Redis 6.0 Redis 7.0 安装并启动Redis 安装scl源 安装Redis5.0 启动Redis 停止Redis Redis重大版本 Redis 借鉴了 Linux 操作系统对于版本号的命名规则&#xff1a;版本号第⼆…

C#裁剪图像的几种方法总结

前言 我们在上位机软件开发过程中经常需要裁剪图像&#xff0c;本文就是对c#中常见的裁剪图像方法进行总结。 1、克隆 直接调用Bitmap的Clone函数&#xff0c;然后指定需要裁剪的区域即可裁剪图像&#xff0c;该种方法不会损失精度 public static Bitmap CropImage_Clone(Bi…

[Bugku] web-CTF-网站被黑

1.开启环境 F12查看源代码 没有信息&#xff0c;扫描目录 扫描出shell.php 抓包尝试 使用密码字典爆破密码 得出flag

TypeScript 基础类型与类型声明

前言 在 JavaScript 中&#xff0c;变量是没有类型的&#xff0c;变量的值的类型是在运行时确定的&#xff0c;这被称为动态类型。 这意味着可以在不同的时间将不同类型的值赋给同一个变量&#xff0c;并且 JavaScript 会在运行时根据当前赋给变量的值来确定其类型。 示例&…

学生管理系统之界面设计

学生管理系统之界面设计 建立工程 新建登录界面

自动气象站:高度自动化、智能化和精准化

自动气象站&#xff0c;作为科技进步的产物&#xff0c;以其高度的自动化、智能化和精准化特点&#xff0c;极大地提升了气象观测的效率和准确性。它集成了多种高精度传感器&#xff0c;能够全天候、不间断地监测温度、湿度、气压、风速、风向、降水量等关键气象要素&#xff0…

RabbitMq架构原理剖析及应用

文章目录 RabbitMQ 架构组件1. **Broker** (Broker Server)2. **Exchange**3. **Queue**4. **Producer** (消息生产者)5. **Consumer** (消息消费者)6. **Virtual Hosts** (虚拟主机) 工作流程内部原理1. **队列管理**2. **集群**3. **持久化与内存**4. **性能优化** 高级特性1…

高德地图离线版 使用高德地图api的方法

高德离线包我已经存至Gitee&#xff08;自行下载即可&#xff09;&#xff1a;高德地图离线解决方案: 高德地图离线解决方案 然因为高德地图的瓦片地图太大&#xff0c;所以要让后端部署下 前端直接调用 如果本地 直接找到瓦片图路径就可以 initMap () {const base_url "…

基于 Kafka 的经验:AutoMQ 和 MinIO 如何解决成本和弹性挑战

Apache Kafka 因其出色的设计和强大的功能而成为流式处理的事实标准。它不仅定义了现代流式处理的架构&#xff0c;而且其独特的分布式日志抽象还为实时数据流处理和分析提供了前所未有的功能。Kafka 的成功在于它能够满足高吞吐量和低延迟的数据处理需求&#xff0c;多年来&am…

(2024|ICLR,∞-Diff,无限维平滑扩散,希尔伯特空间,超分辨率,多尺度架构)具有子采样平滑状态的无限分辨率扩散

∞-Diff: Infinite Resolution Diffusion with Subsampled Mollified States 目录 0. 摘要 1. 简介 2. 生成式神经场 3. 无限维扩散模型 3.1 平滑化&#xff08;Mollificaition&#xff09; 3.2 无限维度平滑扩散 4. 参数化扩散过程 4.1 神经算子 4.2 多尺度架构 4.3…

element-plus框架+vue3+echart——后台页面

一、图表样式 图表组件&#xff1a;echarts https://echarts.apache.org/examples/zh/index.html element-plus框架&#xff1a; https://www.cwgj.xyz/zh-CN/ 1、折线图 栅格 一共24。 12代表占一半50%&#xff0c; 当页面缩小到一定程度 占整个屏幕的100%。 id"mo…

【Axure教程】拖拉拽编辑页面

低代码开发平台通常提供拖拉拽编辑页面的功能&#xff0c;使用户无需编写大量代码即可创建复杂的应用程序和页面。这种平台的特点是通过图形用户界面来进行开发&#xff0c;用户可以拖拽组件到画布上进行布局和配置。 那今天作者就教大家在Axure里怎么制作拖拉拽动态编辑页面的…

01 LVS负载均衡群集

1.1 LVS群集应用基础 群集的称呼来自于英文单词“Cluster"&#xff0c;表示一群、一串的意思&#xff0c;用在服务器领域则表示大量服务器的集合体&#xff0c;以区分于单个服务器。 1.1.1 群集技术概述 LVS&#xff08;Linux Virtual Server&#xff09;是Linux虚拟服…

linux下的线程

概念理解 linux下没有线程的概念&#xff0c;只有轻量级进程的概念&#xff0c; 有接口&#xff1a;clone() 是clone&#xff08;&#xff09;调用&#xff0c;在库中创建栈 源码解析 int clone(int (*fn)(void *), void *child_stack,int flags, void *arg, .../* pid_t *p…

【Spring】详细了解静态代理和动态代理的使用

目录 1.代理模式介绍 2. 静态代理 3.动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 4. 动态代理和静态代理的区别 1.代理模式介绍 代理模式分为动态代理和静态代理&#xff0c;目的是在不直接暴露真实对象的情况下&#xff0c;通过代理对象来间接访问真实对象&#xff0c;从…

【设计模式】设计模式之观察者模式

文章目录 观察者模式什么是观察者模式引入组成UML图代码实现1. 定义观察者接口2. 定义主题接口3. 实现具体观察者4. 实现具体被观察者5.测试 应用场景优点缺点 观察者模式 什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种设计模式 它定义了一种…

vLLMcuda安装笔记

1. 引言 最近在部署Qwen模型时&#xff0c;文档上有提到强烈建议用vLLM来部署模型&#xff0c;按照公开的性能测试数据&#xff0c;用vLLM部署Qwen模型的文本推理速度要比transformers部署快3~4倍。带着这个好奇就开始安装尝试&#xff0c;但试下来这个安装过程并没有那么顺利…

最新个人免签约支付系统源码|PHP源码 | 码支付系统 | ThinkPHP6框架 | 开源

源码介绍&#xff1a; 这个最新的个人专用免签约支付系统源码&#xff01;是PHP源码写的哦&#xff0c;而且是用ThinkPHP6框架开发的&#xff0c;完全开源的码支付系统。 这个系统适合个人用户使用&#xff0c;作为收款的免签约解决方案。它还加入了监控端&#xff0c;可以拒…

Linux 调试追踪: trace-cmd 和 kernelshark

文章目录 1. 前言2. 概述3. trace-cmd3.1 下载3.2 交叉编译3.3 安装、运行3.3.1 trace-cmd 示范&#xff1a;抓取系统调度信息 4. kernelshark5. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承…

Java多线程-----定时器(Timer)及其实现

目录 一.定时器简介&#xff1a; 二.定时器的构造方法与常见方法&#xff1a; 三.定时器的模拟实现&#xff1a; 思路分析&#xff1a; 代码实现&#xff1a; 在开发中&#xff0c;我们经常需要一些周期性的操作&#xff0c;例如每隔几分钟就进行某一项操作&#xff0c;这…