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

news2024/11/6 17:31:50

标准库中的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.coloradmin.cn/o/2229176.html

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

相关文章

守护头顶安全——AI高空抛物监测,让悲剧不再重演

在城市的喧嚣中&#xff0c;我们享受着高楼林立带来的便捷与繁华&#xff0c;却往往忽视了那些隐藏在高空中的危险。近日&#xff0c;震惊全国的高空抛物死刑案件被最高院核准并执行。案件中被告人多次高空抛物的举动&#xff0c;夺去了无辜者的生命&#xff0c;也让自己付出了…

好消息:貌似稳定盈利了;坏消息:发财无望

声明&#xff1a;股市有风险&#xff0c;入市需谨慎。所有材料仅供学习参考&#xff0c;不构成投资建议。 作者&#xff1a;NazariteBruce 事实上&#xff0c;从8月份就开始在测试自己的量化系统&#xff0c;连续三个月赚钱了&#xff0c;虽然赚的不多&#xff0c;但是也验证了…

【Linux网络】TCP_Socket

目录 TCP协议&#xff08;传输控制协议&#xff09; listen状态 accept和connect TCP_echo_server (1)创建套接字 &#xff08;2&#xff09;绑定 &#xff08;3&#xff09;设置listen状态 &#xff08;4&#xff09;loop &#xff08;5&#xff09;客户端 多线程远程…

算法|牛客网华为机试11-20C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试1-10C 文章目录 HJ11 数字颠倒HJ12 字符串反转HJ13 句子逆序HJ14 字符串排序HJ15 求int型正整数在内存中存储时1的个数HJ16 购物单HJ17 坐标移动HJ18 识别有效的IP地址和掩码并进行分类统计HJ19 简单错误记录HJ20 密码验证…

Pandas DataFrame学习补充

1. 从字典创建&#xff1a;字典的键成为列名&#xff0c;值成为列数据。 import pandas as pd# 通过字典创建 DataFrame df pd.DataFrame({Column1: [1, 2, 3], Column2: [4, 5, 6]}) 2. 从列表的列表创建&#xff1a;外层列表代表行&#xff0c;内层列表代表列。 df pd.Da…

剖析高精度、直线电机技术八大常见问题你了解吗?

在现代工业自动化和机械工程的快速发展背景下&#xff0c;高精度直线电机技术逐渐崭露头角&#xff0c;成为推动各类高端设备和系统的重要力量。直线电机以其独特的工作原理和优越的性能特点&#xff0c;广泛应用于数控机床、自动化生产线、机器人等领域。 一、什么是高精度直线…

如何解决RabbitMQ消息的重复消费问题

什么情况下会导致消息的重复消费——在消费者还没成功发送自动确认机制时发生&#xff1a; 网络抖动消费者挂了 解决方案 每条消息设置一个唯一的标识id幂等方案&#xff1a;【Redis分布式锁、数据库锁&#xff08;悲观锁、乐观锁&#xff09;】 面试官&#xff1a;如何解决…

jade 0919 | 提取自TVBox的直播盒子,频道丰富高清

jade电视直播app覆盖央视全频道和各大卫视&#xff0c;各地地方台也能一网打尽&#xff0c;随时随地看高清电视。各卫视台覆盖广泛&#xff0c;包括浙江电视台、湖南卫视、江苏卫视、东方卫视等全部卫视台&#xff0c;最新内容先一步掌握。拥有广东、北京、风云足球等热播体育频…

书生大模型实战营第四期-入门岛第一关

关卡任务 好的&#xff0c;我们废话不多说&#xff0c;开始闯关Go,Go,Go! 闯关任务 SSH连接到本地使用开发机是很舒服的&#xff0c;但是我们该如何连接呢&#xff0c;别急&#xff0c;书生给我们教程了 这里我们展示结果&#xff0c;对了&#xff0c;本地SSH连接需要安装一些…

臻于智境 安全护航 亚信安全受邀出席新华三智算新品发布会

近日&#xff0c;紫光股份旗下新华三集团在北京隆重举办了主题为“乘势 进化 臻于智境”的新华三智算新品发布会。作为新华三集团的长期战略合作伙伴&#xff0c;亚信安全受邀参会&#xff0c;亚信安全CEO马红军出席发布仪式&#xff0c;并与来自各界的业界伙伴共同探讨智能化…

错题收集app有哪些?5个软件帮助你快速进行app收集

错题收集app有哪些&#xff1f;5个软件帮助你快速进行app收集 以下是五款便捷实用的错题收集 App&#xff0c;能够帮助你更高效地记录、整理和复习错题&#xff1a; 试卷全能宝 试卷全能宝 是一款多功能试卷识别和编辑软件&#xff0c;适合用于错题整理和记录。你可以创建错…

GitGraphPro 图管理系统

1.产品介绍 产品介绍方案 产品名称: GitGraphPro 图管理系统 主要功能: 智能图谱构建版本控制与协作数据分析与可视化自定义模板与导出功能介绍: 1. 智能图谱构建 具体作用:GitGraphPro 利用先进的算法,自动从项目数据

flask框架用法介绍(一)

flask框架用法介绍(一) 一、创建flask项目二、创建模板以及简单的前后端数据传递三、在模板中使用条件判断和循环3.1 条件判断3.2 for循环四、模板继承一、创建flask项目 项目框架如下: app.py内容如下: from flask import Flaskapp = Flask(__name__)@app.route("…

[免费]SpringBoot+Vue学生成绩管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue学生成绩管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue学生成绩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着计算机互联网技术的不断发展&#xff0c;不断…

接口测试(九)jmeter——关联(JSON提取器)

一、JSON提取器介绍 要检查的响应字段&#xff1a;样本数据源引用名称&#xff1a;可自定义设置引用方法&#xff1a;${引用变量名}匹配数字 匹配数字含义-1表示全部0随机1第一个2第二个…以此类推 缺省值&#xff1a;匹配失败时的默认值ERROR&#xff0c;可以不写 二、js…

【MyBatis源码】SqlSessionFactoryBuilder源码分析

文章目录 概述类结构从 InputStream 创建 SqlSessionFactoryXMLConfigBuilder构建ConfigurationXMLConfigBuilder初始化方法parse()方法parseConfiguration属性&#xff08;properties&#xff09; 概述 SqlSessionFactory 是 MyBatis 的核心接口之一&#xff0c;提供创建 Sql…

鸿蒙原生应用开发及部署:首选华为云,开启HarmonyOS NEXT App新纪元

目录 前言 HarmonyOS NEXT&#xff1a;下一代操作系统的愿景 1、核心特性和优势 2、如何推动应用生态的发展 3、对开发者和用户的影响 华为云服务在鸿蒙原生应用开发中的作用 1、华为云ECS C系列实例 &#xff08;1&#xff09;全维度性能升级 &#xff08;2&#xff…

SQLite3库增删改查实现数据管理

1. SQLite3简介 SQLite3是一个轻量级的、嵌入式的关系型数据库管理系统&#xff0c;在保存测序数据或结果等时可使用&#xff0c;简单高效&#xff0c;并且有无需服务器、单文件存储数据、支持标准SQL、支持跨平台等优势。 本文以Sqlite3数据库为基础&#xff0c;创建代码示例…

【实验八】前馈神经网络(4)优化问题

1 参数初始化 模型构建 模型训练 优化 完整代码 2 梯度消失问题 模型构建 模型训练 完整代码 3 死亡Relu问题 模型构建 模型训练 优化 完整代码 1 参数初始化 实现一个神经网络前&#xff0c;需要先初始化模型参数。如果对每一层的权重和偏置都用0初始化&#xff0…

Vscode配置CC++编程环境的使用体验优化和补充说明

文章目录 快速编译运行&#x1f47a;code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)&#x1f60a;使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…