C++vector

news2024/11/24 20:50:03

C++vector是标准库中的一员,vector直译过来是“向量”、“矢量”的意思,在C++中,是一个动态的数组容器,可以动态的开辟空间,自动实现内存的管理,不需要我们手动操作,在标准库中,写作一个类模版,可以传递不同的类型实例化出不同类型的vector。

template < class T, class Alloc = allocator<T> > class vector;

1.构造函数(constructor)

常见的构造方式有下面几种,由于vector在实例化的时候,传递不同的类型就会实例化出不同的vector,所以标准库中没有设计打印的接口,因此在讲解的时候,单独添加了一个vector_print模版函数,可以打印不同类型的vector:

template<class T>
void vector_print(const vector<T>& v)
{
	// 这里的typename不可省略,因为编译器还不知道const_iterator是一个类型,
	// 需要添加typename告诉编译器,我们需要从vector<T>这个类中获取const_iterator类型
	// (也可以用auto就可以避免这样的问题)
	typename vector<T>::const_iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << "\n";
}

下面是常见的构造方式:

	vector<int> v0;		//默认构造初始化
	vector<int> v1(5,1);	//用n个值初始化
	vector<int> v2(v1.begin(),v1.end());	//利用迭代器区间初始化
	vector<int> v3(v2);		//拷贝构造初始化
	cout << "v0:"; vector_print(v0);
	cout << "v1:"; vector_print(v1);
	cout << "v2:"; vector_print(v2);
	cout << "v3:"; vector_print(v3);

 2.迭代器(Iterators)

begin:返回vector中的第一个位置
end:返回vector中的最后一个位置的下一个位置
rbegin:返回vector中的最后一个位置
rend:返回第一位置的前一个位置
const vector在前面+c(cbegin、cend、crbegin、crend)

	vector<int> v0(5,0);
	vector<int>::iterator itb = v0.begin();
	vector<int>::reverse_iterator ritb = v0.rbegin();

	vector<int>::iterator ite = v0.end()-1;
	vector<int>::reverse_iterator rite = v0.rend() - 1;

	*itb = 1;
	*ite = 1;
	cout << "v0:"; vector_print(v0);

	*ritb = 2;
	*rite = 2;
	cout << "v0:"; vector_print(v0);

 3.容器(Capacity)

size:返回vector的有效数据数量
max_size:vector能储存的最大数量(取决于实例化的类型和编译器)
resize(n):重置vector的size(若当前size > n,那么多的数据会被移除,若当前size < n的话,多的数据会以默认值初始化)
capacity:返回vector的容量
empty:检查vector是否为空
reserve(n):重置vector的容量为所给值(若当前capacity > n,不会缩容,因为官方文档中说明了此接口除了n > capacity的情况,其余情况不会影响原来的capacity,若当前capacity <  n,则扩容)
shrink_to_fit:将capacity减为size

	vector<int> v0(5, 1);
	cout << "原始v0 :";
	vector_print(v0);
	cout << "size: " << v0.size() << "\n"
		 << "max_size: " << v0.max_size() << "\n"
		 << "capacity: " << v0.capacity() << endl;
	cout << "----------------------------------" << endl;

	v0.reserve(2);
	cout << "将capacity置为2后的v0: ";
	vector_print(v0);
	cout << "size: " << v0.size() << "\n"
		 << "capacity: " << v0.capacity() << endl;
	v0.reserve(10);
	cout << "将capacity置为10后的v0:";
	vector_print(v0);
	cout << "size: " << v0.size() << "\n"
		<< "capacity: " << v0.capacity() << endl;
	cout << "----------------------------------" << endl;

	v0.resize(3);
	cout << "将size置为3后的v0:";
	vector_print(v0);
	cout << "size: " << v0.size() << "\n"
		<< "capacity: " << v0.capacity() << endl;
	v0.resize(8);
	cout << "将size置为8后的v0:";
	vector_print(v0);
	cout << "size: " << v0.size() << "\n"
		<< "capacity: " << v0.capacity() << endl;
	cout << "----------------------------------" << endl;

	v0.shrink_to_fit();
	cout << "shrink_to_fit后的v0:";
	vector_print(v0);
	cout << "size: " << v0.size() << "\n"
		<< "capacity: " << v0.capacity() << endl;
	cout << "----------------------------------" << endl;

4.元素访问符(Element access)

operator[ i ]:返回下标为i的元素(像数组一样访问)
at(n):返回在第n个位置的元素
front:获取第一个元素
back:获取最后一个元素
data:返回第一个元素的指针

	vector<int> v0(6, 1);
	cout << "v0: ";
	for (int i = 0; i < v0.size(); i++)
	{
		v0[i] += i;
		cout << v0[i] << " ";	//通过下标方式遍历
	}
	cout << endl;
	cout << "v0.front(): " << v0.front() << endl;
	cout << "v0.back(): " << v0.back() << endl;
	cout << "v0.at(3): " << v0.at(3) << endl;
	cout << "*(v0.data()): " << *(v0.data()) << endl;
	cout << "首元素地址:" << endl;
	cout << v0.data() << endl;
	cout << &v0[0] << endl;

5.修饰符(Modifiers)

assign:重置vector的内容
push_back:尾插一个元素
pop_back:尾删一个数据
insert:插入一个数据
erase:清除vector中某个内容或者某段范围的内容
swap:交换两个vector
clear:清除vector的整个内容

	vector<char> v0(1,'h');
	cout << "assign前的v0: ";
	vector_print(v0);
	
	v0.assign(1,'v');
	cout << "assign后的v0: ";
	vector_print(v0);
	cout << "尾插七个字符后的v0: " << endl;
	v0.push_back('e');
	v0.push_back('c');
	v0.push_back('t');
	v0.push_back('o');
	v0.push_back('r');
	v0.push_back('o');
	v0.push_back('r');
	vector_print(v0);

	cout << "pop_back v0后二个字符: " << endl;
	v0.pop_back();
	v0.pop_back();
	vector_print(v0);

	cout << "头插六个字符后的v0: " << endl;
	v0.insert(v0.begin(), 'h');
	v0.insert(v0.begin()+1, 'e');
	v0.insert(v0.begin()+2, 'l');
	v0.insert(v0.begin()+3, 'l');
	v0.insert(v0.begin()+4, 'o');
	v0.insert(v0.begin()+5, ' ');
	vector_print(v0);
	v0.erase(v0.begin(), v0.begin() + 6);
	cout << "erase v0前五个字符: " << endl;
	vector_print(v0);

	vector<char> v1;
	v1.swap(v0);
	cout << "v0和v1 swap:" << endl;
	cout << "v0: ";
	vector_print(v0);
	cout << "v1: ";
	vector_print(v1);
	v1.clear();
	cout << "v1: ";
	vector_print(v1);

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

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

相关文章

“漫步北京”小程序及“气象景观数字化服务平台”上线啦

随着科技的飞速发展&#xff0c;智慧旅游已成为现代旅游业的重要趋势。近日&#xff0c;北京万云科技有限公司联合北京市气象服务中心&#xff0c;打造的“气象景观数字化服务平台“和“漫步北京“小程序已经上线&#xff0c;作为智慧旅游的典型代表&#xff0c;以其丰富的功能…

LlamaIndex+本地部署InternLM实践

LlamaIndex本地部署InternLM实践 XTuner是一个调整模型参数的小工具,通过对于给定的大模型输入有限的参数来调整同类型问题的结果输出 ‌LlamaIndex‌是一个将大语言模型&#xff08;LLMs&#xff09;和外部数据连接在一起的工具&#xff0c;主要用于增强大模型的知识获取能力…

【阵列信号处理】相干信号和非相干信号生成

文章目录 一、总结二、知识点相干&#xff08;coherent&#xff09;和非相干&#xff08;incoherent&#xff09;信号相干信号生成代码 相关信号&#xff08;correlated signal&#xff09;相关信号生成代码 正交信号定义 本文记录博主的科研日记。如果对博主的其他文章感兴趣&…

vue3项目部署在阿里云轻量应用服务器上

文章目录 概要整体部署流程技术细节小结 概要 vue3前端项目部署在阿里云轻量服务器 整体部署流程 首先有一个Vue3前端项目和阿里云应用服务器 确保环境准备 如果是新的服务器&#xff0c;在服务器内运行以下命令更新软件包 sudo apt update && sudo apt upgrade -y …

东土科技孵化的“网联汽车高速通信技术”前沿产品亮相2024WICV大会

2024世界智能网联汽车大会&#xff08;WICV&#xff09;于近日在北京召开。本次大会发布了由中国汽车工程学会组织全球200余位专家&#xff0c;联合评审遴选出未来十年对于智能网联汽车发展具有重要影响的十大技术趋势&#xff0c;包括“面向高级别自动驾驶的超级人工智能”“网…

【云计算网络安全】解析 Amazon 安全服务:构建纵深防御设计最佳实践

文章目录 一、前言二、什么是“纵深安全防御”&#xff1f;三、为什么有必要采用纵深安全防御策略&#xff1f;四、以亚马逊云科技为案例了解纵深安全防御策略设计4.1 原始设计缺少安全策略4.2 外界围栏构建安全边界4.3 访问层安全设计4.4 实例层安全设计4.5 数据层安全设计4.6…

关于相机选型的一些参数说明

上一篇&#xff1a;关于相机的一些参数计算&#xff08;靶面、视野等&#xff09; 目录 1.卷帘快门和全局快门1.1 卷帘快门1.2 全局快门PS&#xff1a;视觉伺服与快门选择 2.黑白和彩色3.CCD和CMOS3.1 CCD3.2 CMOSCCD VS CMOS 4.面阵和线扫4.1 面阵4.2 线扫4.3 面阵 VS 线扫 5.…

C 语言复习总结记录二

C 语言复习总结记录二 一 控制语句 1、语句的分类 表达式语句函数调用语句复合语句控制语句空语句 控制语句 控制程序的执行流程&#xff0c;实现程序的各种结构方式 C 语言支持三种结构 &#xff1a;顺序结构、选择结构、循环结构&#xff0c;由特定的语句定义符组成C语言…

【mongodb】社区版8:改变配置bindip和授权

更改配置 sudo systemctl restart mongod (base) root@k8s-master-pfsrv:/home/zhangbin# sudo tail -n 20 /var/log/mongodb/mongod.log 日志感觉是成功了:{"t":{"$date":"2024-11-19T19:57:47.076+08:00"

28.UE5游戏框架,事件分发器,蓝图接口

3-3 虚幻游戏框架拆解&#xff0c;游戏规则基础_哔哩哔哩_bilibili 目录 1.游戏架构 2.事件分发器 2.1UI控件中的事件分发器 2.2Actor蓝图中的事件分发器 2.2.1动态决定Actor的分发事件 2.2.2父类中定义事件分发器&#xff0c;子类实现事件分发器 2.3组件蓝图中实现事件…

P1 练习卷(C++4道题)

1.纷繁世界 内存限制&#xff1a;256MB 时间限制&#xff1a;1s 问题描述 这是一个纷繁复杂的世界。 某一天清晨你起床很迟&#xff0c;没有吃上早饭。于是你骑着自行车去超市&#xff0c;但是你又发现商店的工作人员已经重新贴上了价格标签&#xff0c;零食价格都涨了50%。你…

挂壁式空气净化器哪个品牌的质量好?排名top3优秀产品测评分析

随着挂壁式空气净化器市场的不断扩大&#xff0c;各类品牌与型号琳琅满目。但遗憾的是&#xff0c;一些跨界网红品牌过于追求短期效益&#xff0c;导致产品在净化效果与去除异味方面表现平平&#xff0c;使用体验不佳&#xff0c;甚至可能带来二次污染风险&#xff0c;影响人体…

贴代码框架PasteForm特性介绍之image

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

C++异常: cv::Exception 解决

原因是C中文件路径错误&#xff0c;\ 号在字符串中表示转义字符&#xff0c;"C:\Users\14421\Desktop\123.png" "C:Usersd21DesktopS.png" &#xff0c;所以应该改为 C:\\Users\\14421\\Desktop\\123.png 或者 C:/Users/14421/Desktop/123.png 即可解决问…

libphone desktop编译

linphone-desktop 在ubuntu20.04 下编译 linphone 介绍 Linphone是一款遵循GPL的开源网络视频电话系统&#xff0c;支持多种平台如Windows、Linux、Android等。它基于SIP协议&#xff0c;提供语音、视频通话及即时文本消息功能。核心功能包括SIP用户代理、音频视频Codec支持、…

高精度计算题目合集

高精度计算题目合集 1168&#xff1a;大整数加法 1168&#xff1a;大整数加法 1168&#xff1a;大整数加法 高精度加法原理&#xff1a; a&#xff0c;b&#xff0c;c 都可以用数组表示。这些都是基于c语言的算术运算符形成的运算。 c 3 ( c 1 c 2 ) % 10 c_3(c_1c_2)\%1…

【Python】爬虫实战:高效爬取电影网站信息指南(涵盖了诸多学习内容)

本期目录 1 爬取思路 2 爬虫过程 2.1 网址 2.2 查看网页代码 3 爬取数据 3.1 导入包 3.2 爬取代码 01 爬取思路 \*- 第一步&#xff0c;获取页面内容\*- 第二步&#xff1a;解析并获取单个项目链接 \*- 第三步&#xff1a;获取子页面内容 \*- 第四步&#xff1a;解析…

【bug】使用transformers训练二分类任务时,训练损失异常大

使用transformers训练二分类任务时&#xff0c;训练损失异常大 问题分析 问题 training_loss异常大&#xff0c;在二分类损失中&#xff0c;收敛在1~2附近&#xff0c;而eval_loss却正常&#xff08;小于0.5&#xff09; 分析 参考&#xff1a; Bug in gradient accumulation…

uni-app 认识条件编译,了解多端部署

一. 前言 在使用 uni-app 进行跨平台开发的过程中&#xff0c;经常会遇到需要针对不同平台或不同环境进行条件编译的情况。条件编译是一种在编译过程中根据指定条件选择不同代码路径的技术&#xff0c;可以帮助我们在不同平台或环境下编写不同的代码&#xff0c;以适应不同的平…

HarmonyOS Next原创项目

学友市集 HarmonyOS毕设,项目完整,代码原创,可接毕设 项目展示 项目简介 学友集市是一款基于HarmonyOS Next开发的二手交易平台,适配HarmonyOS5.0&#xff0c;采用前后端分离架构&#xff0c;致力于为用户提供安全、便捷、高品质的二手商品交易服务。平台整合了华为云认证服…