【STL】string类 (上) <vector>和<list>的简单使用

目录

一,什么是 STL 

二,STL 的六大组件

三,标准库中的 string 类

1,string 类 

2,string 类的常用接口

1,string类对象的常见构造

2,string(const string& str)

3,string (const string& str, size_t pos, size_t len = npos);

4,string (const char* s )

5,string (const char* s,size_t n);

6,string (size_t n,char c);

3,遍历和访问

四,iterator 迭代

五,逆置字符串 reverse

六, 栈

七,队列


一,什么是 STL 

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

二,STL 的六大组件

三,标准库中的 string 类

string 类的介绍:

https://cplusplus.com/reference/string/string/?kw=string

1,string 类 

总结:

1,string 是表示字符串的字符串类

2,该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作 string 的常规操            作。

3,string 在底层实际是:basic_string 模板类的别名,typedef basic_string string;

4,不能操作多字节或者变长字符的序列。

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

2,string 类的常用接口

1,string类对象的常见构造

详情:cplusplus.com/reference/string/string/string/

函数名称功能说明
string()构造空的 string 类对象,即空字符串
string(const string& str)拷贝构造函数
string (const string& str, size_t pos, size_t len = npos);
截取从 pos 开始 npos 长度的字符串
string (const char* s );用C-string 来构造 string 类对象
string (const char* s,size_t n);截取字符串前 n 个字符
string (size_t n,char c);

string 类对象中包含 n 个字符c

2,string(const string& str)

拷贝构造函数

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

int main()
{
	string s1 = "abc";
	string s2(s1);
	cout << s2 << endl;
	return 0;
}

记得加上头文件  #include<string> ;

3,string (const string& str, size_t pos, size_t len = npos);

截取从 pos 开始 npos 长度的字符串

int main()
{
	string s1 = "hello world";
	string s3 (s1, 2, 5);
	cout << s3 << endl;
	
	string s4(s1, 0, 10);
	cout << s4 << endl;

	string s5(s1, 3);
	cout << s5 << endl;

	return 0;
}

第一个数:目标字符串

第二个数:代表下标,从下标位置开始;

第三个数:代表长度,如果没写的话就一直读取到 ' \0 ' 为止;

4,string (const char* s )

用C-string 来构造 string 类对象

int main()
{
	string s1("hello world");
	cout << s1 << endl;

	string s2("hahaha 666");
	cout << s2 << endl;
	return 0;
}

5,string (const char* s,size_t n);

截取字符串前 n 个字符

int main()
{
	string s1("hello world",5);
	cout << s1 << endl;

	string s2("hahaha 666",2);
	cout << s2 << endl;
	return 0;
}

第一个数:要写双引号字符串形式的,要不然会和string (const string& str, size_t pos, size_t                      len = npos);起冲突;

第二个数:代表读取的个数,从头开始;

6,string (size_t n,char c);

string 类对象中包含 n 个字符c

int main()
{
	string s1(10,'x');
	cout << s1 << endl;

	string s2(5,'a');
	cout << s2 << endl;
	return 0;
}

3,遍历和访问

int main()
{
	string s1("hello world");
	cout << s1.size() << endl;
	cout << s1.length() << endl;

	int i = 0;
	for (i = 0; i < s1.size(); i++)
	{
		cout << s1[i] <<" ";
	}

	return 0;
}

s1.size() 和 s1.length 是求字符串长度的;

访问时可以直接像数组一样用 [ 下标 ] 的形式;

四,iterator 迭代

string 类给我们提供了一个 迭代 iterator,来帮助我们进行遍历;

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

	return 0;
}

string::iterator 是一个类型,it 可以把它看作是一个指针;

s1.begin() 就是相当于第一个元素的指针地址,s1.end() 相当于最后 \0 的地址;

五,逆置字符串 reverse

我们先来逆置一个字符串

int main()
{
	string s1("hello world");
	int begin = 0, end = s1.size()-1;
	while (begin< end)
	{
		int tmp = s1[begin];
		s1[begin] = s1[end];
		s1[end] = tmp;
		begin++;
		end--;
	}
	cout << s1 << endl;
	return 0;
}

 reverse 逆置字符串

int main()
{
	string s1("hello world");
	reverse(s1.begin(), s1.end());
	cout << s1 << endl;
	return 0;
}

是不是简单多了;

六,<vector> 栈

我们写栈再也不用手搓了,直接用c++库里面的栈就可以了,需要包含头文件 #include<vector>;

int main()
{
	vector<int> s1;
	s1.push_back(1);
	s1.push_back(2);
	s1.push_back(3);
	s1.push_back(4);
	s1.pop_back();

	vector<int>::iterator st = s1.begin();
	while (st != s1.end())
	{
		cout << *st << " ";
		st++;
	}
	return 0;
}

而且迭代 iterator 对栈也一样有用;

对逆置函数 reverse 也一样有效果;

int main()
{
	vector<int> s1;
	s1.push_back(1);
	s1.push_back(2);
	s1.push_back(3);
	s1.push_back(4);
	s1.pop_back();
	reverse(s1.begin(), s1.end());

	vector<int>::iterator st = s1.begin();
	while (st != s1.end())
	{
		cout << *st << " ";
		st++;
	}
	return 0;
}

七,队列 <list>

我们以后也不用手搓队列了,c++库里面也有队列,我们直接用即可,需要包含头文件 #include<list>;

int main()
{
	list<int> sl;
	sl.push_back(1);
	sl.push_back(2);
	sl.push_back(3);
	sl.push_back(4);
	sl.pop_back();
	
	list<int>::iterator lt = sl.begin();
	while (lt != sl.end())
	{
		cout << *lt << " ";
		lt++;
	}
	return 0;
}

也是一样的用法,也同样适用于 迭代 iterator;

逆置 reverse 函数也是OK的;

int main()
{
	list<int> sl;
	sl.push_back(1);
	sl.push_back(2);
	sl.push_back(3);
	sl.push_back(4);
	sl.pop_back();
	
	reverse(sl.begin(), sl.end());

	list<int>::iterator lt = sl.begin();
	while (lt != sl.end())
	{
		cout << *lt << " ";
		lt++;
	}
	return 0;
}

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

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

相关文章

(数据结构)算法的时间复杂度

注意语句频度和时间复杂度的区别&#xff0c;语句频度是指语句执行的次数&#xff0c;不可以像时间复杂度一样近似次数和省略常数项

算法设计与分析复习--贪心(一)

文章目录 上一篇贪心的性质活动安排问题贪心背包问题最优装载哈夫曼编码下一篇 上一篇 算法设计与分析复习–动态规划 贪心的性质 贪心和动态规划都要求问题具有最优子结构&#xff1b; 可用贪心方法时&#xff0c;动态规划可能不适用 可用动态规划方法时&#xff0c;贪心方法…

【数据结构】栈

1.58.33 栈 栈栈的概念及基本结构栈的存储栈的基本操作栈的置空初始化---StackInit()栈的初始化2.0---给栈开辟一点空间StackInit1()栈的销毁---StackDestory()入栈----StackPush()出栈----StackPop()获取栈中元素的数量---StackSize()判断栈是否为空---StackEmpty()获取栈顶元…

Kali Linux:网络与安全专家的终极武器

文章目录 一、Kali Linux 简介二、Kali Linux 的优势三、使用 Kali Linux 进行安全任务推荐阅读 ——《Kali Linux高级渗透测试》适读人群内容简介作者简介目录 Kali Linux&#xff1a;网络与安全专家的终极武器 Kali Linux&#xff0c;对于许多网络和安全专业人士来说&#x…

Windows 的 WSL 中运行 EasyConnect

Windows 的 WSL 中运行 EasyConnect docker-easyconnect 安装 Docker Desktop 通过 Docker 的官网 Docker Desktop 下载并安装. 安装过程一直下一步即可, 默认推荐 WSL 模式 初始化过程需要梯子 安装完后在搜索框搜索 docker-easyconnect hagb/docker-easyconnect 就是需要…

在线ws/wss调试工具

具体前往&#xff1a;在线webSocket(ws)调试工具

nacos网关

目录 拉取docker镜像 环境配置 网关搭建架构 wemedia-gateway网关配置 依赖 启动类配置 网关yml配置 nacos配置中心配置网关 wdmedia服务配置 依赖 启动类配置 yml配置 nacos配置 nacos中的配置共享 nacos配置 wmedia模块中yml的配置 参考:https://blog.csdn.net/…

真心建议看看这个盈亏平衡点计算方法及要点解析!

说实话&#xff0c;进行产品动态盈亏平衡计算是非常考验人的&#xff0c;因为不是人人都具备评估不同产品组合的盈利能力和掌握风险的方法。 当然最简单的方式就是套用诸如单产品动态盈亏平衡表之类的现成模板进行测算&#xff0c;可以实现以下三点基本需求&#xff1a; 弹性输…

Linux进程——system函数、popen函数

system函数&#xff08;执行shell 命令&#xff09; 头文件 #include <stdlib.h> 函数定义 int system(const char * string); 函数说明 system()会调用fork()产生子进程&#xff0c;由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令&#xff0c;…

腾讯微服务平台TSF学习笔记(一)--如何使用TSF的Sidecar过滤器实现mesh应用的故障注入

Mesh应用的故障注入 故障注入前世今生Envoy设置故障注入-延迟类型设置故障注入-延迟类型并带有自定义状态码总结 故障注入前世今生 故障注入是一种系统测试方法&#xff0c;通过引入故障来找到系统的bug&#xff0c;验证系统的稳健性。istio支持延迟故障注入和异常故障注入。 …

微信第三方平台开发重点概念流程梳理

标题 微信开发的亿点点概念第三方平台代开发流程亿些概念开发流程 代公众号使用JS SDK一些概念具体流程引用 微信开发的亿点点概念 AppID&#xff1a;AppID是不同类型的产品的账号ID,是账号的唯一标识符。例如公众号的AppID、小程序的AppID、开放平台的AppID、第三方平台的App…

图像分类(五) 全面解读复现ResNet

解读 Abstract—摘要 翻译 更深的神经网络往往更难以训练&#xff0c;我们在此提出一个残差学习的框架&#xff0c;以减轻网络的训练负担&#xff0c;这是个比以往的网络要深的多的网络。我们明确地将层作为输入学习残差函数&#xff0c;而不是学习未知的函数。我们提供了非…

项目出错汇总

java: 错误: 无效的源发行版&#xff1a;15 java: 无效的目标发行版: 17 四步加上这个,改一下

ADS村田电感.mod(spice netlist文件)和.s2p模型导入与区别

ADS村田电感.mod&#xff08;spice netlist文件&#xff09;和.s2p模型导入与区别 简介环境过程s2pspice netlist&#xff08;.mod文件&#xff09;导入和结果对比 简介 记录了ADS村田电感.mod&#xff08;spice netlist文件&#xff09;和.s2p模型导入与区别 环境 ADS2020 …

Springboot框架中使用 Redis + Lua 脚本进行限流功能

Springboot框架中使用 Redis Lua 脚本进行限流功能 限流是一种用于控制系统资源利用率或确保服务质量的策略。在Web应用中&#xff0c;限流通常用于控制接口请求的频率&#xff0c;防止过多的请求导致系统负载过大或者防止恶意攻击。 什么是限流&#xff1f; 限流是一种通过…

【【SOC设计之 数据回路从 DMA到 FIFO再到BRAM 再到FIFO 再写回DMA】】

SOC设计之 数据回路从 DMA到 FIFO再到BRAM 再到FIFO 再写回DMA 基本没问题的回路设计 从 DMA出发将数据传递到 FIFO 再 写到 自定义的 RTL文件中 再写到 BRAM 再到 自定义的RTL文件 再到 FIFO 再写回DMA block design 的 设计连接 可以参考我上一个文件的设计 下面介绍两个c…

gd32关于IO引脚配置的一些问题

一、gd32f103的PA15问题 1、 #define GPIO_SWJ_NONJTRST_REMAP ((uint32_t)0x00300100U) /*!< full SWJ(JTAG-DP SW-DP),but without NJTRST */ #define GPIO_SWJ_SWDPENABLE_REMAP ((uint32_t)0x00300200U) /*!< JTAG-DP disabled and SW-DP enab…

参数值为列表,不懂代码如何参数化?

最近在我的教学过程中&#xff0c;我的一个学生问了我一个问题&#xff0c;他们公司的一个接口参数值是列表&#xff0c;列表中值的数量有多有少&#xff0c;问我在 jmeter 中如何让这个参数的值进行参数化&#xff1f; 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视…

IIC 通信协议之stm32 驱动OLED

前言 使用stm32 驱动4 Pin 的OLED&#xff0c; 现在网上开源的资料多的是&#xff0c;但是为了锻炼自己使用第一手资料的能力&#xff0c;今天我还是从数据手册开始&#xff0c;从头造一波轮子&#xff0c;同时也是为了加深自己对 IIC 协议的理解 &#xff0c;本系列内容我会从…