【C++】string 之 assign、at、append函数的学习

2023-09-17 14:37:28

前言

在学习string类的过程中,我发现了assign这个函数,感觉很有用,就来记录一下

assign函数原型:

void assign(size_type n, const T& x = T());

void assign(const_iterator first, const_iterator last);

assign函数有两种使用方式:

第一种:容器名.assign (a, b);

容器名.assign (a, b);

将vector中的内容清空,并给予a个b元素

下面给出一个例子:

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

int main()
{
	vector<int>v1{ 1,2,3 };
	//创建一个容器v1 元素类型是int 有三个元素

	v1.assign(2, 5);
	
	for (int val : v1)
	{
		cout << val << endl;
	}

	cout << "--------------------" << endl;

	v1.assign(4, 5);

	for (int val : v1)
	{
		cout << val << endl;
	}

	cout << "--------------------" << endl;

	int a = 2;
	int b = 3;
	int n = a * b;
	int x;
	v1.assign(n, x);
	for (int val : v1)
	{
		cout << val << endl;
	}

	cout << "--------------------" << endl;

	return 0;
}

通过上面这个例子,我们可以发现,首先,在传入新的元素之前,assign函数会先清空vector中的内容,之后,再传入新的数据,并且,无论是传入一个变量,还是传入未初始化的变量,都可以实现assign的功能

注意:第一个元素,即要传入的元素个数不能是未初始化的变量,不然程序会报错

第二种:容器名2.assign(容器名1.begin(),容器名1.end());

容器名2.assign(容器名1.begin(),容器名1.end());

提示:
这种使用方法的含义就是:
将容器1中的begin()和end()之间的元素放到容器2中,包含起始位置和终止位置。同样的,也是先清空容器2中的内容

下面给出一个例子:

#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int>v1{ 1,2,3 };
	vector<int>v2{ 1,2 };

	v2.assign(v1.begin(), v1.end());

	for (int val : v2)
	{
		cout << val << endl;
	}

	cout << "--------------" << endl;

	v2.assign(v1.begin() + 1, v1.end() - 1);

	for (int val : v2)
	{
		cout << val << endl;
	}

	cout << "--------------" << endl;

	return 0;
}

通过上面这些例子,相信我们就可以基本明白assign是如何使用的了

at函数

函数源码

vector<_Tp, _Allocator>::at(size_type __n)
{
	if (__n >= size())
		this->__throw_out_of_range();
	return this->__begin_[__n];
}

了解即可,不用深究

at函数的使用

arr[3]与arr.at(3)的效果是一样的,只是使用at函数,不会发生越界访问的情况,更加安全

举个例子:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
	vector<int>arr{ 1,2,3,4,5 };

	for (int i = 0; i < arr.size(); i++)
	{
		cout << arr.at(i) << endl;
	}

	//cout << arr.at(5) << endl;
	return 0;
}

运行结果:
在这里插入图片描述
相信通过上面的学习,我们已经明白了如何使用at函数

append函数

接下来,我们来学习append函数

用法1:完全复制

格式:

append函数的使用格式:

字符串1.append(字符串2);

例子:

下面,举一个例子,方便大家理解:

#include<iostream>

using namespace std;

int main()
{
	string a = "qaz";
	string b = "wsx";
	string c = "edc";
	cout << a << endl;

	a.append(b);

	cout << a << endl;

	a.append(b + c);

	cout << a;

	return 0;
}

运行结果:
在这里插入图片描述
通过上面这个例子,我们可以知道虽然append函数一次只能复制一个字符串,但这个字符串是可以先运算的,比如:b+c

用法2:部分复制(后面的字符)

append除了复制全部内容以外,还可以选取部分进行复制

格式:

使用格式:

字符串1.append(字符串2,起始位置index,复制元素个数n);

作用:
将字符串2中第index个位置开始(包含起始位置的元素),共n个元素,拷贝到字符串1的末尾

例子:

下面给出一段代码,方便大家理解:

#include<iostream>

using std::string;
using std::cout;
using std::endl;

int main()
{
	string a = "hello";
	string b = "world";
	cout << a << endl;

	a.append(b, 2, 3);

	cout << a << endl;

	return 0;
}

运行结果:
在这里插入图片描述
特别的:
当只传入起始位置index,而不传入复制元素个数n的时候,编译器默认拷贝到字符串末尾

用法3:部分复制(前面的字符)

格式:

字符串1.append(C语言风格的字符串2,复制元素的个数n);

将字符串2中从开始位置算起,共复制n个元素放到字符串1的末尾

例子:

#include<iostream>

using namespace std;

int main()
{
	string a = "hello";
	const char* b = "world";

	a.append(b, 3);

	cout << a << endl;

	return 0;
}

运行结果:
在这里插入图片描述

注意:

直接传入字符串的时候,编译器默认它是C语言风格的字符串

例子如下:

#include<iostream>

using namespace std;

int main()
{
	string a = "hello";
	a.append("world", 5);

	cout << a << endl;

	return 0;
}

在这里插入图片描述

用法4:复制相同字符

格式:

字符串1.append(复制字符的个数n,复制的字符ch);

作用:
将n个ch复制到字符串1的后面

例子:

#include<iostream>

using namespace std;

int main()
{
	string a = "hello";

	char c = '!';

	a.append(3, c);

	cout << a << endl;

	int n = 4;

	a.append(n, 'h');

	cout << a << endl;

	return 0;
}

运行结果:
在这里插入图片描述

结语

对于assign、at和append函数的学习和介绍到这里就结束了,希望这篇文章对你有帮助,我们下次见~

更多推荐

真实的产品开发中,后端的设计规约可以写哪些

真实的产品开发中,后端的设计规约可以写哪些产品开发的后端设计规约通常包括以下内容:数据模型设计:详细描述数据库的结构,包括数据表的设计、字段的定义和关系的设置等。业务逻辑设计:详细描述后端的业务逻辑,包括各种算法的设计、业务流程的控制等。API设计:定义后端提供的各种服务接口,包括接口的URL、请求方法、请求参数、响应

CMMI认证是什么?为什么IT类企业都在申请?

如今,越来越多的公司都会去申请获得CMMI的认证,也会以通过认证为荣,那么CMMI认证的意义和目的是什么?怎样可以拿到CMMI认证呢?什么是CMMI?CMMI是由美国卡内基梅隆大学的软件工程研究所(SEI)提出的能力成熟度模型集成,致力于以更加系统和一致的框架来指导组织改善软件过程,提高产品和服务的开发、获取和维护能力

华为云ROMA Connect亮相Gartner®全球应用创新及商业解决方案峰会,助力企业应用集成和数字化转型

9月13日-9月14日Gartner全球应用创新及商业解决方案峰会在伦敦举行本届峰会以“重塑软件交付,驱动业务价值”为主题,全球1000多位业内专家交流最新的企业应用、软件工程、解决方案架构、集成与自动化、API等企业IT战略和新兴技术热门话题。9月13日,华为流程ITROMA首席专家陆昕,华为云ROMAConnect

在JavaScript中,什么是柯里化(currying)?

聚沙成塔·每天进步一点点⭐专栏简介⭐柯里化(Currying)⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习

html播放视频

文章目录<embed>标签<object>标签<video>标签<video>浏览器支持视频格式与浏览器的支持DOM元素提供的方法、属性和事件自定义控制栏<embed>标签<embed>标签的作用是在HTML页面中嵌入多媒体元素。前提:浏览器支持Flash。iPad和iPhone不能显示Flash视频。视频不能转成其他

【ES6知识】 Reflect 与 Proxy

文章目录前言一、Proxy代理对象1.1基本应用1.2同一个拦截器函数,可以设置拦截多个操作:1.3Proxy支持的拦截操作一览,一共13种:二、Reflect对象2.1基本使用2.2`Reflect`对象一共有13个静态方法三、使用Proxy实现观察者模式前言Proxy与Reflect是ES6为了操作对象引入的API

源码编译Qt 5.15.9+msvc2019

官方文档里给出了详细步骤:BuildingQtSourcesBuildingQt5fromGit(Wiki)注:本文基于windows11+vs2019x64+qt5.15.9,不编译QtWebEngine归纳总结如下:准备阶段QtforWindows-Requirements安装python,我这里用的是anacon

如何在Vue中引入video.js,并如何监听相关事件,禁止拖拽

如何在Vue中引入video.js,并如何监听相关事件最近考虑做一个视频播放网站,所以接触video.js会多一些,之前考虑到使用Vue-video-player来实现相关功能,结果发现当前技术已不再支持Flash播放器,无奈采用videojs,官方文档链接奉上Video.js1.Vue使用Video.jsa.引入vi

PDF文件的页眉页脚无法删除的原因和三种替代方法

大家好!今天六分职场为大家介绍一个PDF的常用操作。有的时候我们需要为PDF文件添加页眉页脚,但如果我们这个PDF文档是从其他地方参考的,经常会发现无法直接编辑或者删除PDF文件中页眉页脚。不用担心,我们使用WPS的PDF软件,有两种替代的方法可以删除PDF的页眉页脚,然后插入自己的页眉页脚。一、PDF页眉页脚无法删除

Windows系统部署WebDAV服务结合内网穿透实现公网访问,轻松共享文件与资源

windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】文章目录windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】1.安装IIS必要WebDav组件2.客户端测试3.cpolar内网穿透3.1打开Web-UI管理界面3.2创建隧道3.3查看在线隧道列表3.4浏览器访问测试4.安装Raidr

分布式事物【XA强一致性分布式事务实战、分布式架构的理论知识、TCC核心组成】(六)-全面详解(学习总结---从入门到深化)

目录XA强一致性分布式事务实战_业务层实现分布式架构的理论知识_BASE理论BASE理论三要素分布式事务解决方案_最终一致性分布式事务最终一致性分布式事务解决方案_TCC是什么TCC核心组成Hmily实现TCC分布式事务实战_认识Hmily-TCCHmily实现TCC分布式事务实战_业务场景介绍XA强一致性分布式事务实

热文推荐