【C++】:vector容器的基本使用

news2024/11/13 15:15:08

目录

  • 🍒1,vector的介绍
  • 🍒2,vector的使用
    • 🐯2.1 vector的构造
    • 🦁2.2 vector iterator 的使用
    • 🌽2.3 vector 空间增长问题
    • 🍓2.4 vector 增删查改
    • 🐯2.5 vector 访问及遍历
    • 🦊2.6 vector实例化string类的初始化形式
    • 🌴2.7 sort算法的使用

🍒1,vector的介绍

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

🍒2,vector的使用

vector学习时一定要学会查看文档:vector的文档介绍vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。

注意:使用vector要包含 < vector >

🐯2.1 vector的构造

我们先介绍使用两个重点的构造使用,其余两个在下一篇模拟实现的文章中会涉及。

在这里插入图片描述

代码演示:

void TestVector1()
{
    //无参构造
    vector<int> v1; 
    
    //构造并用4个100初始化
    vector<int> v2(4, 100);

	//拷贝构造
    vector<int> v4(v3); 
    
    //用迭代区间初始化                      
    vector<int> v3(second.begin(),second.end());
                          

}

🦁2.2 vector iterator 的使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码演示:

void TestVector2()
{
	// 使用push_back插入4个数据
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	// 使用迭代器进行遍历打印
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	// 使用迭代器进行修改
	it = v.begin();
	while (it != v.end())
	{
		*it *= 2;
		++it;
	}

	// 使用反向迭代器进行遍历再打印
	// vector<int>::reverse_iterator rit = v.rbegin();
	auto rit = v.rbegin();
	while (rit != v.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

	PrintVector(v);
}

🌽2.3 vector 空间增长问题

在这里插入图片描述

代码演示1:

reisze(size_t n, const T& data = T())
将有效元素个数设置为n个,如果时增多时,增多的元素使用data进行填充。
注意:resize在增多元素个数时可能会扩容

void TestVector3()
{
	vector<int> v;

	//插入一些数据
	for (int i = 1; i < 10; i++)
		v.push_back(i);

	v.resize(5);
	v.resize(8, 100);
	v.resize(12);

	cout << "v contains:";
	for (size_t i = 0; i < v.size(); i++)
		cout << ' ' << v[i];
	cout << '\n';
}

代码演示2:

往vecotr中插入元素时,如果大概已经知道要存放多少个元素,可以通过reserve方法提前将容量设置好,避免边插入边扩容效率低。

void TestVectorExpandOP()
{
	vector<int> v;
	size_t sz = v.capacity();
	
	//提前将容量设置好,可以避免一遍插入一遍扩容
	v.reserve(100);   
	
	cout << "making bar grow:\n";
	for (int i = 0; i < 100; ++i) 
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}

注意:

  1. capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。
    这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
  2. reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
  3. resize在开空间的同时还会进行初始化,影响size。

🍓2.4 vector 增删查改

在这里插入图片描述

注意:insert和erase会涉及迭代器失效问题,这个问题比较复杂,将在vector的模拟实现里介绍。

代码演示1:

// 尾插和尾删:push_back/pop_back
void TestVector4()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	auto it = v.begin();
	while (it != v.end()) 
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	v.pop_back();
	v.pop_back();

	it = v.begin();
	while (it != v.end()) 
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

代码演示2:

注意find不是vector自身提供的方法,是STL提供的算法。

// 任意位置插入:insert和erase,以及查找find
void test_vector4()
{
	vector<int> v1;

	v1.push_back(1);
	v1.push_back(25);
	v1.push_back(12);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	v1.insert(v1.begin(), 0);//头插
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	v1.erase(v1.begin());//头删
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	v1.insert(v1.begin() + 2, 50);//在中间位置插
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	int x;
	cin >> x;
	//没有x就不插入,有x在它前面插入
	//find是算法里的函数 
	vector<int>::iterator pos = find(v1.begin(), v1.end(), x);
	if (pos != v1.end())
	{
		v1.insert(pos, 1000);
	}
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
}

🐯2.5 vector 访问及遍历

// operator[]+index 和 C++11中vector的新式for+auto的遍历
// vector使用这两种遍历方式是比较便捷的。
void TestVector6()
{
	vector<int> v{ 1, 2, 3, 4 };

	// 通过[]读写第0个位置。
	v[0] = 10;
	cout << v[0] << endl;

	// 1. 使用for+[]方式遍历
	for (size_t i = 0; i < v.size(); ++i)
		cout << v[i] << " ";
	cout << endl;

	// 2. 使用迭代器遍历
	cout << "swapv data:";
	auto it = swapv.begin();
	while (it != swapv.end())
	{
		cout << *it << " ";
		++it;
	}

	// 3. 使用范围for遍历
	for (auto x : v)
		cout << x << " ";
	cout << endl;
}

🦊2.6 vector实例化string类的初始化形式

注意:
(1) 有名对象和匿名对象的使用形式的区别。

(2) 此时范围for的使用,最好加上const 和 &
因为范围for的底层其实是迭代器,* it 赋值给e,而这里的*it是string类,每次赋值都是深拷贝,所以加引用可以避免多余的拷贝构造,const是因为不修改。

void TestVector7()
{
	vector<string> v1;//此时v1指向的就是对象数组

	//有名对象
	string s1("张三");
	v1.push_back(s1);

	//匿名对象
	v1.push_back(string("李四"));

	//直接单参数隐式类型转换
	v1.push_back("王五");

	//对名字进行修改
	v1[1] += "你好";

	//加const &
	//范围for的底层其实是*it赋值给e
	//而这里的*it是string类,每次赋值都是深拷贝
	for (const auto& e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
}

🌴2.7 sort算法的使用

sort不在vector中,在STL的算法库中。

在这里插入图片描述

(1) sort算法默认排升序,它的参数需要传迭代器。

(2) 那如何控制升降序呢?根据sort的第二个重载,多了一个仿函数的参数。就是下面代码中的greater(降序),less(升序)。其实这两个也是模板,再用这个模板进行实例化对象。并且又重载了operator() 运算符

void TestVector8()
{
	//sort算法的使用
	vector<int> v1;

	v1.push_back(1);
	v1.push_back(25);
	v1.push_back(12);
	v1.push_back(9);
	v1.push_back(0);
	v1.push_back(40);

	//默认排升序
	greater<int> gt1;//降序 >
	less<int> gt2;//升序 <

	//重载了operator()
	cout << gt1(3, 4) << endl;//0
	cout << gt1.operator()(3, 4) << endl;
	
	//全部排序
	//有名对象使用
	//sort(v1.begin(), v1.end(),gt1);

	//匿名对象使用
	sort(v1.begin(), v1.end(), greater<int>());

	//去头去尾排
	//sort(v1.begin() + 1, v1.end() - 1);

	//对前一半排序
	//sort(v1.begin(), v1.begin() + v1.size() / 2);

	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
}

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

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

相关文章

2022全国大学生数学建模竞赛ABC题(论文+代码)

文章目录 &#xff08;1&#xff09;2022A波浪能最大输出功率&#xff08;2&#xff09;2022B无人机定位&#xff08;3&#xff09;2022C古代玻璃制品成分分析&#xff08;4&#xff09;论文和代码链接 &#xff08;1&#xff09;2022A波浪能最大输出功率 &#xff08;2&#x…

用(华为)三层交换技术解决不同vlan间通信问题

用三层交换技术解决不同vlan间通信问题 一、网络拓扑&#xff1a; 二、配置思路&#xff1a;自下而上配置 1.PC端配置基本IP信息包括网关 2.接入交换机S1上划分三个vlan&#xff0c;分别是VLAN 10 VLAN 20 VLAN 30 并且将对应的接口加入指定的vlan 3.给接入交换机配置trunk链路…

华为交换机基础实验----VLAN基础

交换机篇实验&#xff1a; 给交换机创建VLAN 1.单个VLAN的创建 [S]vlan 10 查看的方法&#xff1a;dis vlan 2.批量创建vlan的方法 Vlan b 20 30 40 连续创建三个vlan&#xff0c;分别为vlan20 vlan30和vlan40 [SONY-S1-vlan10]vlan b 20 30 40 3.批量创建连续的vlan&#xf…

找不到vcruntime140.dll等140dll的解决方法,怎么才能快速的修复?

找不到vcruntime140.dll等140dll要怎么办&#xff1f;以上这两个其实都是属于dll文件来的&#xff0c;它们的缺失会导致某些程序直接运行不了&#xff0c;你需要重新的进行修复&#xff0c;然后程序才可以运行下去&#xff0c;下面一起来了解一下找不到vcruntime140.dll等140dl…

逻辑回归(头歌)

第1关&#xff1a;逻辑回归算法大体思想 #encodingutf8import numpy as np#sigmoid函数 def sigmoid(t):#输入&#xff1a;负无穷到正无穷的实数#输出&#xff1a;转换后的概率值#********** Begin **********#result 1.0 / (1 np.exp(-t))#********** End **********#retur…

C++笔试强训day34

目录 1.ISBN号码 2.kotori和迷宫 3.矩阵最长递增路径 1.ISBN号码 链接https://www.nowcoder.com/practice/95712f695f27434b9703394c98b78ee5?tpId290&tqId39864&ru/exam/oj 提取题意&#xff0c;模拟一下即可。 #include <iostream> using namespace std; …

su模型转3d模型不够平滑怎么办?---模大狮

当将SU模型转换为3D模型时&#xff0c;可能会遇到模型不够平滑的情况&#xff0c;这会影响到最终的渲染效果和视觉体验。本文将探讨在此情况下应该如何解决&#xff0c;帮助读者更好地处理这一常见的问题。 一、检查SU模型细分程度 首先要检查的是原始的SU模型的细分程度。在S…

Python爬虫项目实战:百度任意图片抓取

大家好&#xff0c;我是南枫&#xff0c;这篇文章我将给大家介绍如何使用Python爬虫来达到想爬哪个明星图片就能爬下来的效果&#xff0c;那我们接下来看看如何实现的吧。 导入Python的requests库和re库。requests库用于发送HTTP请求&#xff0c;而re库用于处理正则表达式。 通…

鸿蒙知识点总结

1 Stage模型应用程序包结构 在开发态&#xff0c;一个应用包含一个或者多个Module&#xff0c;可以在DevEco Studio工程中创建一个或者多个Module。Module是HarmonyOS应用/服务的基本功能单元&#xff0c;包含了源代码、资源文件、第三方库及应用/服务配置文件&#xff0c;每一…

5款好用的AI写作软件,一键生成高质量文章

在当今信息快速发展的时代&#xff0c;AI写作软件逐渐成为创作者们的得力助手。它们能够凭借先进的技术和算法&#xff0c;一键生成高质量的文章&#xff0c;为创作者们节省大量的创作时间和精力。以下是5款备受好评的AI写作软件&#xff0c;下面在本文中分享给大家&#xff0c…

SpringBoot中注解@RestController | @ResponseBody | @Controller

ResponseBody 可以修饰类和方法 Controller 和 RestController 只能修饰类 RestController 告诉Spring&#xff0c;帮我们管理这个代码&#xff0c;我们后续访问时&#xff0c;才能访问到 RequestMapping 路由映射&#xff0c;可以修饰方法&#xff0c;也可以修饰类 访问地址…

蓝桥杯单片机-国赛6——第13届国赛主观题

0.比赛真题 1. 编程心得 DAC输出需要放到while循环里&#xff0c;一直持续的输出才能检测到稳定电压涉及锁存器5的部分&#xff1a;relay、buzz、motor……等不要放到while循环里&#xff0c;会造成蜂鸣器暴鸣。而是应该写一个带形参的函数&#xff0c;直接进行调用led的刷新&a…

作业-day-240527

Cday1思维导图 定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置 #include <iostream>using namespace std;namespace my_space {string s1"abc123";string recover(string s){int i0…

SEO 真心没有必要纠结百度收录升降的!

明月会经常收到站长们发来有关百度收录下降寻求帮助的咨询&#xff0c;针对这个问题明月也没有很好的解决办法&#xff0c;因为这是目前搜索引擎的常态&#xff0c;几乎每天都有可能下降和上升&#xff0c;几乎是没有任何规律的。因为现在搜索引擎无时无刻不在更新和调整算法&a…

将YOLO格式数据集转换为YOLO-Mamba等特定工具指定的数据集格式

目录 克隆Github YOLO-Mamba源码YOLO-Mamba数据集格式下载的公开数据集目录边界框坐标文件类别标签文件 数据集格式转换代码转换格式的效果展示 今天为大家解析YOLO-Mamba这篇论文开源的代码&#xff0c;首先讲解YOLO格式数据集转换为YOLO-Mamba等特定工具指定的数据集格式的操…

VMware ESXi中安装Proxmox VE

0、巴拉巴拉 前几天某行业HW&#xff0c;闲暇的时候几个技术人员聊天&#xff0c;臭味相投的聊到自己玩的东西。有个玩家说家里用工作站安装Proxmox VE&#xff0c;然后在上面安装软路由、安装NAS。我以前一直想玩玩&#xff0c;没有付诸行动&#xff0c;所以也想弄个集中的方案…

快速失败“fail-fast”和安全失败“fail-safe”

目录 快速失败——fail-fast 异常原因 正常原因 安全失败“fail-safe” 快速失败——fail-fast java的快速失败机制是java集合框架中的一种错误检测机制&#xff0c;当多个线程对集合中的内容进行修改时可能就会抛出ConcurrentModificationException异常。不仅仅在多线程状态…

[笔试强训day09]

文章目录 BC146 添加逗号DP2 跳台阶JZ61 扑克牌顺子解法一&#xff1a;排序模拟解法二&#xff1a;规律哈希 BC146 添加逗号 BC146 添加逗号 #include<iostream> #include<string>using namespace std;int main() {string s;cin>>s;string ans;for(int i0;i…

Docker学习笔记 - 创建自己的image

目录 基本概念常用命令使用docker compose启动脚本创建自己的image 使用Docker是现在最为流行的软件发布方式&#xff0c; 本系列将阐述Docker的基本概念&#xff0c;常用命令&#xff0c;启动脚本和如何生产自己的docker image。 在我们发布软件时&#xff0c;往往需要把我…

了解区块链基础设施,共同构建安全且强大的Sui网络

区块链基础设施的范畴很广&#xff0c;但其核心是那些直接与网络互动的计算机。这些实体通常被称为节点&#xff0c;分为不同的类型&#xff0c;例如维护完整区块链副本的全节点&#xff0c;以及作为共识决定者的验证节点。除了这两种类型之外&#xff0c;还有其他类型的节点&a…