当前位置: 首页 > article >正文

【C++】vector(1)

在这里插入图片描述

😈个人主页: 起名字真南
😈个人专栏:【数据结构初阶】 【C语言】 【C++】

请添加图片描述

目录

  • 引言
  • 1 vector 的基本知识
    • 1.1 vector 的特点
  • 2 vector 的主要功能和操作
    • 2.1 vector 的构造
    • 2.2 vector 的增删改查
    • 2.3 vector 的容量

引言

在C++的标准模板库(STL)中,vector 是最常用的容器之一。它提供了一个动态数组,允许我们高效地存储和管理大量的数据。相比于传统的 C 风格数组,vector 不仅支持动态扩展,还具备了丰富的成员函数用于操作数据,使得程序更加简洁和高效。在本篇文章中,我们将深入探讨 C++ vector 的实现原理、常见的用法,并通过具体的代码示例展示其在实际应用中的作用。

1 vector 的基本知识

std::vector 是一个动态数组容器,与 C 语言的数组不同,vector 的大小可以动态扩展或缩减。它可以方便地插入、删除、访问和管理元素,并且具备强大的内存管理功能。

vector 基础知识以及相关资料

1.1 vector 的特点

  • 动态扩展:在需要时vector可以动态开辟自己的内存,这点区别于静态数组
  • 连续内存:vector 是STL中的数组容器,其在内存中的存储都是连续的所以可以通过下标访问
  • 迭代器支持:vector 支持通过迭代器进行遍历循环整个容器
  • 自动内存管理 :vector 会自动管理自己的内存,如果空间不够则会自己开辟空间,当元素被删除时vector也会释放不在使用的内存

2 vector 的主要功能和操作

2.1 vector 的构造

构造函数声明接口说明
vector()无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化 nval
vector(const vector& x)拷贝构造
vector(InputIterator first, InputIterator last)使用迭代器进行初始化构造

代码演示:

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

int main()
{
	//创建一个空的vector v1
	vector<int> v1;
	//创建一个有十个数据并且初始化都为9的vector v2
	vector<int> v2(10, 9);
	//拷贝构造
	vector<int> v3(v2);
	//使用迭代器进行构造
	vector<int> v4(v2.begin(), v2.end());

	return 0;
}

调试结果:
在这里插入图片描述
如果我们想通过控制台来直观的看到每个vector的存储情况应该怎么做呢?

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

	cout << "v2 :";
	for (auto it : v2)
	{
		cout << it << " ";
	}
	cout << endl;

	cout << "v3 :";
	for (auto it : v3)
	{
		cout << it << " ";
	}
	cout << endl;

	cout << "v4 :";
	for (auto it : v4)
	{
		cout << it << " ";
	}
	cout << endl;
	return 0;

因为vector支持迭代器遍历循环数组所以我们可以通过迭代器大打印出数组中的所有元素
输出结果:
在这里插入图片描述

2.2 vector 的增删改查

vector增删查改接口说明
push_back(const value_type& val)尾插
pop_back(const value_type& val)尾删
find(InputIterator first, InputIterator last, const T& val)查找。(注意这个是算法模块实现,不是vector的成员接口)
insert(iterator position, const value_type& val)在position之前插入val
erase(const_iterator position)删除position位置的数据
swap(vector& x)交换两个vector的数据空间
operator[]像数组一样访问

代码演示:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);

	for (auto it : v1)
	{
		cout << it << " ";
	}
	cout << endl;
	v1.pop_back();
	v1.pop_back();
	v1.pop_back();

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

	
	//auto it = find(v1.begin(), v1.end(), 2);
	//cout << "insert:";
	//cout << *it << endl;

	//v1.insert(it, 6);
	//for (auto it : v1)
	//{
	//	cout << it << " ";
	//}
	
	//cout << endl;
	//cout << "find:";
	//auto i = find(v1.begin(), v1.end(), 2);
	//v1.erase(i);
	//for (auto i : v1)
	//{
	//	cout << i << " ";
	//}
	//cout << endl;

	vector<int> v2(5, 5);
	vector<int> v3(6, 6);
	cout << "v2 :";
	for (int i = 0; i < 5; i++)
	{
		cout << v2[i];
	}
	cout << endl;
	cout << "v3 :";
	for (int i = 0; i < 6; i++)
	{
		cout << v3[i];
	}

	cout << endl;

	v2.swap(v3);

	cout << "swap" << endl;
	cout << "v2 :" ;
	for (int i = 0; i < 6; i++)
	{
		cout << v2[i];
	}
	cout << endl;
	cout << "v3 :";
	for (int i = 0; i < 5; i++)
	{
		cout << v3[i];
	}

	return 0;
}

我们在使用find函数的时候使用的不是vector的成员函数,而是算法库**(algorithm)**实现的返回的是目标元素的迭代器,我们在使用迭代器进行操作的时候会涉及到迭代器失效的问题这个我们后续会讲,目前只是演示成员函数的使用方法以及使用后在控制台的输出。
输出结果:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.3 vector 的容量

容量空间接口说明
size()返回当前存储的数据个数,即 vector 中实际使用的元素个数
capacity()获取当前分配的内存容量,表示 vector 在不需要重新分配内存的情况下可以存储的最大元素数量
empty()判断容器是否为空,如果 size() 为 0,则返回 true
resize()改变 vector 的大小。如果新大小比当前大,则添加新元素;如果小,则删除多余元素。注意,resize() 也可能触发内存重新分配
reserve()预留指定的容量,不改变 size(),但可能会增加 capacity(),从而减少未来的内存分配次数,提高性能

代码演示:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	vector<int> v1(10, 0);
	vector<int> v2(1);
	cout << "v1.size() :" << v1.size() << endl;
	cout << "v2.size() :" << v2.size() << endl;

	cout << "v1.capacity() :" << v1.capacity() << endl;
	cout << "v2.capacity() :" << v2.capacity() << endl;

	vector<int> v3();
	if (v1.empty())
	{
		cout << "false" << endl;
	}
	else
	{
		cout << "true" << endl;
	}

	v1.resize(20);
	v2.resize(5);

	cout << "v1.resize() :" << v1.size() << endl;
	cout << "v2.resize() :" << v2.size() << endl;

	v1.reserve(21);
	v2.reserve(6);

	cout << "v1.reserve() :" << v1.capacity() << endl;
	cout << "v2.reserve() :" << v2.capacity() << endl;

	return 0;
}

输出结果:
在这里插入图片描述


http://www.kler.cn/news/362073.html

相关文章:

  • konvajs -基础图形-标签-箭头,动画,学习笔记
  • 【保姆级教程】DolphinScheduler本地部署与远程访问详细步骤解析
  • excel将文本型数字转变为数值型数字
  • Linux系统基础-进程间通信(4)_模拟实现进程池
  • Ubuntu22.04 制作系统ISO镜像
  • 【计算机网络 - 基础问题】每日 3 题(五十二)
  • Linux中文件的读写过程
  • 制造企业数字化转型顶层规划案例(55页满分PPT)
  • Vue学习笔记(四、v-bind指令)
  • 复旦大学全球供应链研究中心揭牌,合合信息共话大数据赋能
  • VMware通过Vcenter升级Esxi
  • 人工智能技术的应用与未来展望
  • 电子电气架构---中央/准中央+区域架构已成为OEM主机厂降本利器
  • 059_基于python智能文献管理系统
  • MySQL 创新版9.1.0有哪些功能?
  • 摩熵数科数据产品阵容BCPM
  • docker 微服务实践
  • springboot jackson 数据脱敏
  • json键值对组成的数组去重。
  • 13.3 Linux_网络编程_多路复用I/O接入多客户端
  • 【C语言】一维数组的定义与初始化
  • 设计模式:类与类之间关系的表示方式(聚合,组合,依赖,继承,实现)
  • 【编程语言】Kotlin快速入门 - 伴生对象与懒加载
  • 关于mysql jdbc驱动fetchSize属性的说明
  • 华山论剑之Rust的Trait
  • 【Linux】一个简单while循环实现【严格轮转】,从而理解什么是【多线程的忙等待】