【C++】学习笔记——string_2

文章目录

  • 六、string类
    • 2. 反向迭代器
      • const迭代器
    • string类对象的容量操作(补)
      • size()
    • 3. string类的元素访问
    • 4. string类的修改
  • 未完待续


结合文档食用~

六、string类

2. 反向迭代器

一般来说,迭代器都是正向的遍历容器,虽然可以通过从 end ** 遍历到 begin 的方法来反向遍历容器,但是有这样一种迭代器,叫做反向迭代器**,可以做到反向遍历容器。

#include<iostream>
#include<string>
using namespace std;

void test1()
{
	string s1("hello,world");
	// 反向迭代器 -- reverse_iterator
	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << ' ';
		++rit;
	}
	cout << endl;
}

int main()
{
	test1();
	return 0;
}

在这里插入图片描述
在这里插入图片描述
反向迭代器就是反方向跑,每次+1其实都是往左跑。

const迭代器

当构造时使用 const 修饰,普通的迭代器就不能够使用了。

void test2()
{
	const string s1("hello,world");
	// 这里会出现报错
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << ' ';
		++it;
	}
	cout << endl;
}

此时由于类型不匹配,我们需要调整迭代器。
在这里插入图片描述

使用 const_iterator 就可以了。那么普通迭代器和 const迭代器 有什么区别呢?其实知道const就知道了,普通迭代器对容器是可读可写的,const迭代器就只可读

string类对象的容量操作(补)

在这里插入图片描述

size()

#include<iostream>
#include<string>
using namespace std;

void test3()
{
	string s1("hello,world");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.length() << endl;
	cout << s1.capacity() << endl;
	cout << s1.max_size() << endl;
}

int main()
{
	test3();
	return 0;
}

size() 函数返回string类中的元素个数。
length() 函数和 size() 函数作用一样,返回元素个数。
capacity() 函数返回容器的当前容量,即分配的空间,size() 是使用的空间。
max_size() 函数不常用,返回这个容器能够存储的最大长度,跟编译器有关,输出结果不唯一。
在这里插入图片描述
既然知道了 capacity ,我们来看一看VS环境下的C++扩容机制吧。

#include<iostream>
#include<string>
using namespace std;

void test4()
{
	string s;
	// 初始容量
	int sz = s.capacity();
	cout << sz << endl;
	// 循环插入数据
	for (int i = 0; i < 100; ++i)
	{
		s.push_back('a');
		// 容量有变化时
		if (sz != s.capacity())
		{
			sz = s.capacity();
			// 输出新的容量
			cout << "capacity changed:" << sz << endl;
		}
	}
}

int main()
{
	test4();
	return 0;
}

在这里插入图片描述
也不需要让大家找什么规律,我直接说了:①capacity 求的是不包含字符串末尾的 ‘\0’ 的空间,初始实际上是分配了 16 的空间大小,可用空间只有 15 个数据长度。②第一次扩容是 2倍扩容。③剩下的扩容都是 1.5倍扩容。在其他环境下不一定是这种扩容机制哦。

#include<iostream>
#include<string>
using namespace std;

void test5()
{
	string s("hello,world!!!!!!!!!!!!!!!!!!!!!!");

	cout << s << endl;
	cout << s.capacity() << endl;
	cout << s.empty() << endl;
	s.clear();
	cout << s << endl;
	cout << s.empty() << endl;
	cout << s.capacity() << endl;

}

int main()
{
	test5();
	return 0;
}

在这里插入图片描述

empty() 函数翻译过来就知道功能就是判断容器是否为空,为空返回true,非空返回false
clear() 函数就是清理的意思,它会将容易里的数据都清除。但是,我们发现,capacity() 并没有相应的减少,说明 clear 只清理了数据,并没有释放空间。那我们想要释放空间该怎么办?
在这里插入图片描述
string 提供了这样一个函数,作用是将 capacity 缩小到 size 大小。

#include<iostream>
#include<string>
using namespace std;

void test5()
{
	string s("hello,world!!!!!!!!!!!!!!!!!!!!!!");

	cout << s << endl;
	cout << s.capacity() << endl;
	cout << s.empty() << endl;
	s.clear();
	cout << s << endl;
	cout << s.empty() << endl;
	cout << s.capacity() << endl;
	// 缩容操作
	s.shrink_to_fit();
	cout << s.capacity() << endl;
}

int main()
{
	test5();
	return 0;
}

在这里插入图片描述
实际上它并不能把空间全部释放掉,最小缩容到 16 (有一个’\0’)。

#include<iostream>
#include<string>
using namespace std;

void test6()
{
	string s("hello,worlddddddddddddddddd");
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	s.reserve(100);
	cout << s.capacity() << endl;
}

int main()
{
	test6();
	return 0;
}

在这里插入图片描述
reserve() 函数的作用就是手动分配空间,但是不一定刚刚好分派到你想要的大小。那么,reserve 可以缩容吗?上面情况是想要分配的空间比原来的 capacity 大,假如想要分配的空间比 size 大,比 capacity 小会怎样?比 size 小会怎样?

#include<iostream>
#include<string>
using namespace std;

void test6()
{
	string s1("hello,worlddddddddddddddddd");
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.reserve(100);
	cout << s1.capacity() << endl << endl;

	string s2("hello,worlddddddddddddddddd");
	s2.reserve(100);
	cout << s2.size() << endl;
	cout << s2.capacity() << endl;
	s2.reserve(50);
	cout << s2.capacity() << endl << endl;

	string s3("hello,worlddddddddddddddddd");
	s3.reserve(100);
	cout << s3.size() << endl;
	cout << s3.capacity() << endl;
	s3.reserve(10);
	cout << s3.capacity() << endl << endl;
}

int main()
{
	test6();
	return 0;
}

在这里插入图片描述
所以我们知道,reserve 只有比 capacity 大时才扩容。
reserve 是改变容量,resize() 就是改变数据个数。
在这里插入图片描述
由上图可知:①给 resize 的值比 size 小时,resize 会将多余的给删除,不会修改 capacity 的值。②当给 resize 的值比 size 大,比 capacity 小时,字符串后面会默认插入 ‘\0’,或者给定的值。③当给 resize 的值比 capacity 大时,字符串会扩容至 resize,然后赋值 ‘\0’ 或给定值。

3. string类的元素访问

在这里插入图片描述

#include<iostream>
#include<string>
using namespace std;

void test8()
{
	string s("hello,world");
	// [] 访问
	cout << s[6] << endl;
	// at 访问
	cout << s.at(6) << endl;
	// 直接取头部数据
	cout << s.front() << endl;
	// 直接取尾部数据
	cout << s.back() << endl;
}

int main()
{
	test8();
	return 0;
}

在这里插入图片描述

其中 []at 访问几乎没区别,只是对越界的检查方式不同。

4. string类的修改

在这里插入图片描述

#include<iostream>
#include<string>
using namespace std;

void test9()
{
	string s("123456789");
	cout << s << endl;
	// 字符串末尾追加
	s += '0';
	cout << s << endl;
	// 末尾追加
	s.append("987");
	cout << s << endl;
	// 尾插一个字符
	s.push_back('6');
	cout << s << endl;
	// 完全覆盖
	s.assign("13345889");
	cout << s << endl;
	// 从下标1开始插入
	s.insert(1, "23");
	cout << s << endl;
	// 从下标3开始删除两个字符
	s.erase(3, 2);
	cout << s << endl;
	// 从下标5开始,将1个字符给替换成
	s.replace(5, 1, "67");
	cout << s << endl;;
}

int main()
{
	test9();
	return 0;
}

在这里插入图片描述

insert / erase / replace 需要挪动数据,复杂度大,能不用就不用。这里函数太多,就不一一介绍了,多看看文档就会用了。


未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cmake的使用

一个c工程可能会涉及到很多的基础库&#xff0c;但是c不像python一样可以直接import&#xff0c;因此引入了Cmake&#xff0c;将多个库链接起来。 参考&#xff1a;CMake系列讲解 - 总目录&#xff08;由浅入深&#xff0c;实例讲解&#xff09;_cmake 项目目录-CSDN博客 【C】…

Unity类银河恶魔城学习记录 17-1,2 p166 Aliments fx p167 Blackhole additional vfx

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic; …

综合性练习(后端代码练习4)——图书管理系统

目录 一、准备工作 二、约定前后端交互接口 1、需求分析 2、接口定义 &#xff08;1&#xff09;登录接口 &#xff08;2&#xff09;图书列表接口 三、服务器代码 &#xff08;1&#xff09;创建一个UserController类&#xff0c;实现登录验证接口 &#xff…

OpenCV Mat对象与CImage对象间的数据传输实例

在用MFC写图像处理程序时&#xff0c;使用OpenCV可以做到事半功倍。但是&#xff0c;如果使用OpenCV4.0或OpenCV4.0以后版本&#xff0c;要显示图像可能会遇到麻烦&#xff0c;因为OpenCV去掉了原有的cvGetWindowHandle()函数&#xff0c;没法再用cvGetWindowHandle()函数来获取…

Linux进程管理与监控

一、相关概念 1、进程的的基本定义 在自身的虚拟地址空间运行的一个独立的程序&#xff0c;从操作系统的角度来看&#xff0c;所有在系统上运行的东西&#xff0c;都可以称为一个进程。 2、进程的分类 系统进程&#xff1a;可以执行内存资源分配和进程切换等管理工作&am…

C#知识|泛型集合List相关方法

哈喽&#xff0c;你好&#xff0c;我是雷工&#xff01; 以下为泛型集合List相关方法的学习笔记。 01 集合定义 集合定义的时候&#xff0c;无需规定元素的个数。 02 泛型说明 泛型表示一种程序特性&#xff0c;也就是在定义的时候&#xff0c;无需指定特定的类型&#xff…

C语言嵌入Lua解释器的方法

Lua语言是一个轻量的脚本语言&#xff0c;可以用很少的资源运行其解释器 C语言是一个很常用的语言&#xff0c;广泛用于嵌入式等底层场景 这两个语言结合&#xff0c;可以应用于嵌入式等多个场景。比如&#xff0c;一些硬件公司会允许开发者使用Lua语言操作其硬件 Lua的安装…

搭建Kafka源码环境并测试

文章目录 一、前言二、环境准备三、环境搭建3.1 JDK 环境搭建3.2 Scala 环境搭建3.2.1 配置 Scala 环境变量3.2.2 验证 3.3 Gradle 环境搭建3.3.1 配置 Gradle 环境变量3.3.2 验证 3.4 Zookeeper 环境搭建3.4.1 配置 Zookeeper 环境变量3.4.2 验证 3.5 Kafka 源码搭建3.5.1 导入…

数据可视化宝典:Matplotlib图形实战

在数据分析领域&#xff0c;图形化展示数据是非常重要的环节。Python中的matplotlib库是绘制各类图形的强大工具。本文将介绍如何使用matplotlib绘制折线图、直方图、饼图、散点图和柱状图等数据分析中常见的图形&#xff0c;并附上相应的代码示例&#xff0c;可以当初matplotl…

【C++】——类和对象(初始列表,Static成员,友元)

创作不易&#xff0c;多多支持&#xff01; &#xff01;&#x1f618;&#x1f618; 前言 因为前面的构造函数还有些地方不够清晰&#xff0c;所以这里需要再继续补充一些 一 初始化列表 1.1认识初始化 对于默认的构造函数来说&#xff0c;我们都知道它是起到了初始化的…

3-4STM32C8T6按键控制LED开与关

实物接线如下&#xff1a; 为了代码的简洁性&#xff0c;这里需要对LED与KEY进行封装如下&#xff1a; #include "stm32f10x.h" // Device headervoid LED_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GP…

WSL2-Ubuntu使用Conda配置百度飞浆paddlepaddle虚拟环境

0x00 缘起 本文将介绍在WSL2-Ubuntu系统中,使用Conda配置百度飞浆paddlepaddle虚拟环境中所出现的各种问题以及解决方法,最终运行"run_check()"通过测试。 在WSL2中配置paddlepaddle不像配置Pytorch那样顺滑,会出现各种问题(如:库的文件缺失、不知道如何匹配C…

工厂模式和策略模式区别

工厂模式和策略模式都是面向对象设计模式&#xff0c;但它们的目的和应用场景有所不同。 工厂模式是一种创建型设计模式&#xff0c;旨在通过使用一个工厂类来创建对象&#xff0c;而不是直接使用new关键字来创建对象。这样做可以使系统更容易扩展和维护&#xff0c;因为新的对…

模型智能体开发之metagpt-单智能体实践

需求分析 根据诉求完成函数代码的编写&#xff0c;并实现测试case&#xff0c;输出代码 代码实现 定义写代码的action action是动作的逻辑抽象&#xff0c;通过将预设的prompt传入llm&#xff0c;来获取输出&#xff0c;并对输出进行格式化 具体的实现如下 定义prompt模版 …

Cisco IOS XE Web UI 权限提升漏洞复现(CVE-2023-20198)

0x01 产品简介 Web UI 是一种基于GUI的嵌入式系统管理工具,能够提供系统配置、简化系统部署和可管理性以及增强用户体验。它带有默认映像,因此无需在系统上启用任何内容或安装任何许可证。Web UI 可用于构建配置以及监控系统和排除系统故障,而无需CLI专业知识。 0x02 漏洞…

redis 高可用 Sentinel 详解

写在前面 redis 在我们日常的业务开发中是十分常见的&#xff0c;而redis的可用性就必须要有很高的要求&#xff0c;那么 redis集群的高可用由有一个或者多个 Sentinel(哨兵) 实例组成的 哨兵系统来保证的。 哨兵 由一个或者多个 Sentinel 实例组成的 Sentinel 系统可以监控任…

Java项目:基于SSM框架实现的高校专业信息管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文+PPT+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的高校专业信息管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

Python3.11修改并运行oneforall

遇到的问题 使用python3.11默认无法运行oneforall脚本&#xff0c;出现如下报错 # 解决方案 修改 /usr/local/lib/python3.11/dist-packages/exrex.py exrex.py具体文件路径报错中会显示 vim /usr/local/lib/python3.11/dist-packages/exrex.py# 修改前 from re import sre…

基于Hyperf的CMS,企业官网通用php-swoole后台管理系统

2023年9月11日10:47:00 仓库地址&#xff1a; https://gitee.com/open-php/zx-hyperf-cms CMS&#xff0c;企业官网通用PHP后台管理系统 框架介绍 hyperf SCUI 后端开发组件 php 8.1 hyperf 3.1 数据库 sql(使用最新日期文件) hyperf\doc\sql_bak mysql 8. 系统默认账号…

微软如何打造数字零售力航母系列科普05 - Azure中计算机视觉的视觉指南

Azure中计算机视觉的视觉指南 什么是计算机视觉&#xff1f;如何使用Microsoft Azure将计算机视觉功能集成到应用程序和工作流中&#xff1f; 作者&#xff1a;Nitya Narasimhan 编辑&#xff1a;数字化营销工兵 •11分钟阅读 什么是计算机视觉&#xff1f;如何使用Microso…