秒懂C++之string类(上)

news2024/9/22 13:25:47

fe594ea5bf754ddbb223a54d8fb1e7bc.gif

目录

 

一.string类的常用接口说明

二.不太常用接口(了解接口)

三.string类的遍历访问

3.1 迭代器iterator

3.2 反向迭代器

四.string的其他功能

4.1 reserve(扩容)

4.2 resize

4.3 at

4.4 append

4.5 +=

4.6 insert


一.string类的常用接口说明

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

int main()
{
	string s1;
	string s2("hello world");
	string s3(5, 'a');
	string s4 = s3;//拷贝构造
	string s5(s4);//拷贝构造

	cout << s1 << endl;
	cout << s2 << endl;//hello world
	cout << s3 << endl;//aaaaa
	cout << s4 << endl;//aaaaa
	cout << s5 << endl;//aaaaa

	return 0;
}

二.不太常用接口(了解接口)

给无符号整型(size_t)值-1就相当于是让npos为整型最大值。

从第一位开始读取,往后读5位。

 

默认第0位读起,读5位

 确实不太常用。。。

三.string类的遍历访问

	string s8("abcdef");
	for (size_t i = 0; i < s8.size(); i++)
	{
		cout << s8[i] << " ";
		cout << s8.operator[](i) << " ";
	}
	s8[0] = 'x';
	cout << s8 << endl;//xbcdef

想不到吧,string类也可以用类似数组的【】.可读可写~

不过这都归功于运算符重载

可不要小看这两个版本,下面那个被const成员函数所修饰只读不写~

3.1 迭代器iterator

不过说到遍历真正的主流还是得看迭代器——iterator

	string s1("abcdef");

	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		*it += 1;
		cout << *it << " ";
		++it;
	}
//b c d e f g

现阶段我们通常认为迭代器iterator像指针~

注意:下标+【】只适用于部分容器,底层物理要有一定的连续。 链式结构、树形、哈希结构等等只能用迭代器。

注意:下面的const_iterator可不要当作const iterator it,前者(const_iterator it)本质是保护迭代器的数据,使*it不能改变。而后者(const iterator it)本质是保护迭代器本身 it不能改变。

后面没啥用,本来遍历访问就得靠it本身遍历,加了个const直接废了。

3.2 反向迭代器

	void func(const string & s)
	{
		string::const_reverse_iterator it = s.rbegin();
		//auto it = s.rbegin();
		while (it != s.rend())
		{
			// *it = 'x';

			cout << *it << " ";
			++it;
		}
		cout << endl;

	}

	int main()
	{
		string s1("hello world");
		func(s1);//d l r o w  o l l e h
		return 0; 
	}

因为在func函数中的形参被const所修饰,这意味着*it无法被修改。最后达成逆置的效果~

如果觉得string::const_reverse_iterator这一段太长我们也可以用auto来代替。

四.string的其他功能

4.1 reserve(扩容)

int main()
{
	string s1("hello world");
	cout << s1.size() << endl;//11
	cout << s1.capacity() << endl;//15
	s1.reserve(50);
	cout << s1.size() << endl;//11
	cout << s1.capacity() << endl;//63
	s1.reserve(10);
	cout << s1.size() << endl;//11
	cout << s1.capacity() << endl;//63
	return 0;
}

在vs编译器中reserve的扩容是按1.5倍率慢慢扩容的,而就算我们用reserve提前扩容最后也只会比预估的还大。

(提升:开似开辟了15个空间其实是16个,还有一个预留给‘/0’)

并且在vs编译器中reserve并不能缩容,也无法改变数据。所以基本用于在提前知道所需空间提前扩容节省空间~

4.2 resize

resize不仅可以扩容还会影响到数据的变化~

int main()
{
	string s1("hello world");
	cout << s1.size() << endl;//11
	cout << s1.capacity() << endl;//15
	s1.resize(13);//hello world
	cout << s1.size() << endl;//13
	cout << s1.capacity() << endl;//15
	s1.resize(14,'x');
	cout << s1 << endl;//hello worldx

	s1.resize(1);
	cout << s1.size() << endl;//1
	cout << s1.capacity() << endl;//15
	cout << s1 << endl;//h

	return 0;
}

没有追加字符时会默认在数据后加‘/0’。

当我们尝试缩容的时候发现在vs编译器下还是无法成功,但数据反而被缩小到相应个数了。

resize的作用也就相当于可以开辟空间的时候随便初始化。

4.3 at

int main()
{
	string s1("hello world");
	cout << s1[50] << endl;//直接报错
	cout << s1.at(50) << endl;//抛异常


	return 0;
}

at其实和【】用法基本一样,唯一不同的是它们对越界访问的处理不一样,【】直接报错,而at是抛异常

4.4 append

可以理解为尾插~

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

	s1.append("bbbb");
	cout << s1 << endl;//hello worldbbbb
	s1.append(3,'c');
	cout << s1 << endl;//hello worldbbbbccc

	s2.append(s1.begin(), s1.end());
	cout << s2 << endl;//aaaaaaahello worldbbbbccc




	return 0;
}

这是一些基本用法,但我们一般不用append,还有一个更简单的~

4.5 +=

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

	s1 += 'a';
	cout << s1 << endl;//hello worlda
	s1 += s2;
	cout << s1 << endl;//hello worldaaaaaaaa
	s1 += "ddd";
	cout << s1 << endl;//hello worldaaaaaaaaddd

	return 0;
}

+=的用法比append还简单~

4.6 insert

常见用法: 

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

	s1.insert(0, 1, 'b');//在0位置插入1个字符‘a'
	cout << s1 << endl;
	s1.insert(2, "aaaaa");// bhaaaaaello world
	cout << s1 << endl;

	return 0;

}

 

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

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

相关文章

VS2015加断点(红色),修改过后,断点变为白色不能命中

实际这个问题是因为&#xff1a;源文件和原始版本不同。解决方法有二&#xff1a; 一&#xff0c;在断点上右键&#xff0c;选择“位置”》勾选”允许源代码与原始版本不同&#xff1b; 二&#xff0c;点击菜单栏“调试”》“选项和设置”》“常规”》去掉“要求源文件与原始…

外卖霸王餐运营规划,系统该怎么选择?

在当今的外卖市场中&#xff0c;竞争日益激烈&#xff0c;如何吸引并留住消费者成为了每个餐饮商家关注的焦点。霸王餐作为一种创新的营销策略&#xff0c;以其独特的魅力&#xff0c;吸引了大量消费者的目光。然而&#xff0c;如何有效地运营霸王餐活动&#xff0c;选择合适的…

浅谈断言之XML Schema断言

浅谈断言之XML Schema断言 “XML Schema断言”是一种专门用于验证基于XML的响应是否遵循特定XML Schema定义的标准和结构的断言类型。下面我们将详细探讨XML Schema断言的各个方面。 XML Schema断言简介 XML Schema断言&#xff08;XML Schema Assertion&#xff09;允许用户…

EXO项目解析:pynvml怎么实现监控的,包括什么参数

目录 pynvml怎么实现监控的,包括什么参数 pynvml实现监控的方式 pynvml包括的主要参数 GPU功耗的组成 举例说明 注意事项 EXO项目解析:https://github.com/exo-explore/exo?tab=readme-ov-file 这段代码是一个使用setuptools库编写的Python包安装脚本,主要用于定义和…

std的时间函数——chrono

参考&#xff1a; C 标准库 分数运算&#xff08;ratio库&#xff09; 再也不被时间束缚&#xff1a;C stdchrono时间库全面解析 C11时间类 c11 chrono全面解析(最高可达纳秒级别的精度) C std::chrono库使用指南 (实现C 获取日期,时间戳,计时等功能) 一、std的分数ratio…

Android 防止重复点击

1.第一种方式&#xff1a; private static final int MIN_DELAY_TIME 2000; // 两次点击间隔不能少于2000ms private static long lastClickTime System.currentTimeMillis(); public static boolean isFastClick() { boolean flag true; long currentClickTime …

JMeter接口测试-3.断言及参数化测试

1. 断言 JMeter官方断言&#xff08;Assertion&#xff09;的定义 用于检查测试中得到的响应数据是否符合预期&#xff0c;用于保证测试过程中的数据交互与预期一致 断言的目的&#xff1a; 一个取样器可以添加多个不同形式的断言&#xff0c;根据你的检查需求来添加相应的…

dou dian滑块captchaBody

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi a…

基于生物地理算法的MLP多层感知机优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 生物地理算法&#xff08;BBO&#xff09;原理 4.2 多层感知机&#xff08;MLP&#xff09; 4.3 BBO优化MLP参数 5.完整程序 1.程序功能描述 基于生物地理算法的MLP多层感知机优化mat…

Git之repo sync -l与repo forall -c git checkout用法区别(四十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Java 集合框架:TreeMap 的介绍、使用、原理与源码解析

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 021 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

SpringBoot原理解析(二)- Spring Bean的生命周期以及后处理器和回调接口

SpringBoot原理解析&#xff08;二&#xff09;- Spring Bean的生命周期以及后处理器和回调接口 文章目录 SpringBoot原理解析&#xff08;二&#xff09;- Spring Bean的生命周期以及后处理器和回调接口1.Bean的实例化阶段1.1.Bean 实例化的基本流程1.2.Bean 实例化图例1.3.实…

leetcode算法题之接雨水

这是一道很经典的题目&#xff0c;问题如下&#xff1a; 题目地址 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 解法1&#xff1a;动态规划 动态规划的核心就是将问题拆分成若干个子问题求解&#…

相信开源的力量,MoonBit 构建系统正式开源

MoonBit 构建系统正式开源 作为由 AI 驱动的云服务和边缘计算开发者平台&#xff0c;MoonBit 自设计之初便注重工具链与语言的协同效果。MoonBit 为开发者提供了一套开箱即用的工具链&#xff0c;包括集成开发环境&#xff08;IDE&#xff09;、编译器、构建系统和包管理器&…

内网隧道——HTTP隧道

文章目录 一、ReGeorg二、Neo-reGeorg三、Pivotnacci 实验网络拓扑如下&#xff1a; 攻击机kali IP&#xff1a;192.168.111.0 跳板机win7 IP&#xff1a;192.168.111.128&#xff0c;192.168.52.143 靶机win server 2008 IP&#xff1a;192.168.52.138 攻击机与Web服务器彼此之…

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 目录 Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 一、简单介绍 二、共享纹理 1、共享纹理的原理 2、共享纹理涉及到的关键知识点 3、什么可以实现共享 不能实现共享…

越权与逻辑漏洞

目录 越权漏洞 1、越权原理概述 2、越权分类 2.1、平行越权 2.2、垂直越权 3、越权防范&#xff1a; 逻辑漏洞 1、常见的逻辑漏洞 2、逻辑漏洞概述 3、逻辑漏洞防范&#xff1a; 越权漏洞 1、越权原理概述 如果使用A用户的权限去操作B用户的数据&#xff0c;A的权限…

静态路由技术

一、路由的概念 路由是指指导IP报文发送的路径信息。 二、路由表的结构 1、Destination/Mask:IP报文的接收方的IP地址及其子网掩码; 2、proto:协议(Static:静态路由协议,Direct:表示直连路由) 3、pref:优先级(数值和优先级成反比) 4、cost:路由开销(从源到目的…

jQuery下落撞击散乱动画

jQuery下落撞击散乱动画https://www.bootstrapmb.com/item/14767 在jQuery中实现一个下落撞击后散乱的动画效果&#xff0c;你可以结合CSS动画和jQuery的动画函数来完成。不过&#xff0c;由于jQuery本身并不直接支持复杂的物理效果&#xff08;如撞击后的散乱&#xff09;&a…

Nessus-M 暴力破解Nessus漏扫后台登录工具

项目地址:https://github.com/MartinxMax/Nessus-M Nessus-M Nessus漏洞扫描程序登录界面的暴力破解工具 帮助信息 $ python3 nessus-m.py -h 暴力破解 $ python3 nessus-m.py 192.168.101.156 8834 username.txt /usr/share/wordlists/rockyou.txt --protocol https