C++ vector类成员函数介绍

news2024/11/19 11:21:35

目录

🤔vector模板介绍:

🤔特点:

🤔vector的成员函数:

🔍vector构造函数:

 🔍vector赋值函数

 🔍vector容器的判断函数

    resize函数的重点内容:

🔍 vector的删除和插入

🔍 vector数据存取功能:

🔍vector互换容器

     swap 实际用途:

🤔结束!


🤔vector模板介绍:

          📖vector模板C++标准库中的一个容器类,被设计为动态数组,即它可以根据需要自动分配内存空间来存储元素。vector模板的本质是一个类模板,它使用了C++语言中的模板技术,使其能够适应不同的数据类型,提供了一种通用的容器类实现。
          📖具体而言,vector类使用连续的内存来存储元素,它提供了访问和操作元素的方法,如push_back()、pop_back()、at()、[]等,同时还提供了一些其他的方法,如size()、capacity()、empty()等,以帮助用户管理容器的大小和内存分配等问题。在实际编程中,vector模板可以作为一种通用的容器使用,可以方便地存储和管理各种类型的数据。

🤔特点:

📖1.动态扩容:vector模板可以动态地扩充容器大小,当容器中元素数量增加时,vector会自动分配更多的内存空间来存储元素。这样可以避免手动分配内存空间带来的麻烦和错误。

📖2.随机访问:vector中的元素是连续存储的,因此,可以通过下标的方式(使用[]操作符)来访问任何一个元素。这使得vector可以高效地进行随机访问。

📖3.内存管理:vector会自动管理内存,当元素被删除或者容器的大小被缩小时,vector会自动回收不再需要的内存。这种管理方式可以避免内存泄漏问题。

📖4.插入和删除元素:vector提供了多种插入和删除元素的方法,如push_back()  pop_back()、erase()等。这些方法可以方便地操作容器中的元素。

📖5.大小变化:vector中的元素数量可以随时变化,因此可以方便地进行动态管理。同时,vector还提供了一些方法,如size()、capacity()、empty()等,以帮助用户管理容器的大小和内存分配等问题。

🤔vector的成员函数:

🔍vector构造函数:

📖1.采用模板实现类实现,默认构造函数:vector <T> v;

vector<类型>名称;

📖2.将v[begin(),end())区间中的元素拷贝给自身:vector<v.begin(),v.end()>;

vector<int>v1;
vector<int>v2(v1.begin(), v1.end());

📖3.将n个elem元素拷贝给自身:vector(n,elem);

vector<int>v3 (n, elem);

📖4.将另外一个vector类对象拷贝给自身:vector(const vector &vec);

	vector<int> v4(v3);

📖代码实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << "";
	}
}
void test01()
{	//默认构造  无参构造
	vector<int>v1;
	for (int i = 0; i < 9; i++)
	{
		v1.push_back(i);
	}
	cout << "默认构造:";
	printv(v1);
	cout << endl;


	//区间拷贝构造
	vector<int>v2(v1.begin(), v1.end());
	cout << "区间拷贝构造:";
	printv(v2);
	cout << endl;


	//n个elem构造
	vector<int>v3 (10, 8);
	cout << "n个elem构造:";
	printv(v3);
	cout << endl;

	//拷贝构造
	vector<int> v4(v3);
	cout << "拷贝构造:";
	printv(v4);
	cout << endl;

}
int main()
{
	test01();
}

📖运行结果:


 

 🔍vector赋值函数

📖1.将n个elem拷贝赋值给本身:assign(n,elem);

vector<int>v1;
v1.assign(n, elem);

📖2.将[beg,end)区间中的数据拷贝赋值给本身:assign(begin,end);

vector<int>v2;
v2.assign(v1.begin(), v1.end());

📖3.重载等号运算符:vector &operator =(const vector &vec)

vector<int>v3=v2;

📖代码实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{	//将n个elem拷贝赋值给本身
	vector<int>v1;
	v1.assign(10, 8);
	cout << "将n个elem拷贝赋值给本身";
	printv(v1);
	
	//将[beg,end)区中的数据拷贝复制给自己
	vector<int>v2;
	v2.assign(v1.begin(), v1.end());
	cout << "将[beg,end)区中的数据拷贝复制给自己";
	printv(v2);

	//重载等号赋值运算符
	vector<int>v3=v2;
	cout << "重载等号赋值运算符";
	printv(v3);

}
int main()
{
	test01();
}

📖运行结果:

 🔍vector容器的判断函数

📖1.判断容器是否为空:empty();

📖2.容器的容量:capacity();

📖3.返回容器中元素的个数:size();

📖4.重新指定容器的长度,如果容器变长,就以默认值填充,如果容器变短,则末尾超过容器长度的元素被删除:resize(int num);

📖5.重新指定容器的长度为num,如果容器的长度变长,就以elem值填充新位置,如果容器变短,则末尾超出容器长度元素被删除:resize(int num,elem);

📖代码实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
		cout << endl;
}
void test01()
{
	
	vector<int>v1;
	v1.assign(8, 4);
	printv(v1);
	
	cout <<"该容器是否为空? " << v1.empty() << endl; //1为空,0为不空
	cout <<"该容器的容量是" << v1.capacity() << endl;
	cout <<"该容器中的元素个数是: " << v1.size() << endl;
	v1.resize(12);
	printv(v1);
	
	v1.resize(14, 8);
	printv(v1);

}
int main()
{
	test01();
}

📖运行结果:

resize函数的重点内容:

📖1.编译器扩容会比你要求扩容的,例如你写resize(2000),编译器实际可能扩到2300。

📖2.resize函数的缩放机制不一样❌,如下:

 

📖 代码验证:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test02()
{
	vector <int> v;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
	}

	v.resize(4);
	
	cout << "v的容量为:" << v.capacity() << endl;;
	cout << "v的大小为:" << v.size() << endl;
	v.resize(200000);
	cout << "v.resize(200000)后v的容量为:" << v.capacity() << endl;;
	cout << "v.resize(200000)后v的大小为:" << v.size() << endl;
	v.resize(4);
	cout << "v.resize(4)后v的容量为:" << v.capacity() << endl;;
	cout << "v.resize(4)后v的大小为:" << v.size() << endl;

}
int main()
{
	test02();
}

📖运行结果:

🔍 vector的删除和插入

📖1.对容器尾部元素进行插入:push_back();

📖2.删除最后一个 元素:pop_back();

📖3.从pos位置删除元素elem:insert(const_iterator pos,elem);

📖4.从pos位置上插入count个elem:insert(const _interator pos,int count,ele);

📖5.删除迭代器指向的元素:erase(const_iterator pos);

📖6.删除迭代器从start到end的所有元素:earse(const_iterator start,const_iterator end);

📖7.删除容器中所有元素:clear();

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main()
{
	vector<int>v1(10, 8);
	printv(v1);

	//向末尾插入一个元素9
	v1.push_back(9);
	cout << "插入元素后:";
	printv(v1);

	//删除末尾元素	
	v1.pop_back();
	cout << "删除元素后:";
	printv(v1);

	//在开头的位置插入元素1
	v1.insert(v1.begin(), 1);
	cout << "开头插入元素后:";
	printv(v1);

	//在末尾的位置插入5个6
	v1.insert(v1.begin(), 5, 6);
	cout << "末尾插入元素后:";
	printv(v1);

	//删除开头的第一个元素
	v1.erase(v1.begin());
	cout << "删除开头元素后:";
	printv(v1);

	//删除区间内的所有元素
	v1.erase(v1.begin(), v1.end());
	cout << "删除指定区间元素后:";
	printv(v1);

	//先赋值再清空a
	vector<int>v2(10, 8);
	v1.clear();
	cout << "清空容器元素后:";
	printv(v1);
}

📖运行结果:

🔍 vector数据存取功能:

📖1.取出第idx+1个元素 :at(int idx);

📖2.取出第idx+1个元素:operator[];

📖3.取出容器中第一个元素:front();

📖4.取出容器中最后一个元素:back();

📖元素下标是从0开始的。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	printv(v1);
	cout <<"第三个元素为:" << v1.at(2) << endl;
	cout <<"第四个元素为" << v1[3] << endl;
	cout <<"第一个元素为" << v1.front() << endl;
	cout <<"最后一个元素为" << v1.back() << endl;

}

📖运行结果:

🔍vector互换容器

📖1.将另一个容器与自身进行交换:swap(vec);

📖代码实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main()
{
	cout << "互换前:" << endl;
	vector<int>v1(10, 8);
	printv(v1);

	vector<int>v2(10, 6);
	printv(v2);

	cout << "互换后:" << endl;
	v1.swap(v2);
	printv(v1);
	printv(v2);
}

swap 实际用途:

📖在上面我们已经讲过resize在缩小容器的时候,只能缩小容器的实际使用大小,而不能修改他的容量,这样就会造成大量的内存浪费,而swap函数就提供了一种解决方法:
 代码实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector<int>v1(10, 8);
	printv(v1);

	vector<int>v2(10, 6);
	printv(v2);

	v1.swap(v2);
	printv(v1);
	printv(v2);
}
void test02()
{
	vector <int> v;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
	}

	v.resize(4);
	
	cout << "v的容量为:" << v.capacity() << endl;;
	cout << "v的大小为:" << v.size() << endl;
	

	
	cout << "巧用swap收缩内存";
	
	v.resize(4);
	vector<int>(v).swap(v);
	cout << "v的容量为:" << v.capacity() << endl;;
	cout << "v的大小为:" <<   v.size()   << endl;
}
int main()
{

	test02();
}

📖运行结果:

📖 我们来详细讲解一下原理:
📖先看缩小时用到的代码:

vector<int>(v).swap(v);

📖这串代码实际上是利用拷贝构造,创建了一个匿名对象,将v拷贝给这个匿名对象,此时匿名对象的容量使用大小都等于v实际使用大小,再在让这个匿名对象使用内置swap函数实现容量的转换。

📖图示:

 

🤔结束!

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

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

相关文章

chatgpt赋能python:Python中的并:优化代码执行效率的利器

Python中的并&#xff1a;优化代码执行效率的利器 Python作为一种优秀的编程语言&#xff0c;被广泛使用于各种各样的项目中。然而&#xff0c;随着程序的不断扩张&#xff0c;代码的复杂度日益增加&#xff0c;执行效率也愈加遇到了严峻的挑战。在这种情况下&#xff0c;Pyth…

Linux系统下imx6ull QT编程—— Ubuntu 下编写程序(一)

Linux QT编程 文章目录 Linux QT编程前言一、C简介二、C环境设置1.安装编译 C 语言和 C的环境。2.创建文件编写代码3.编译运行代码 总结 前言 绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一个 C源文件。通过编写最简单的示例“Hello,World QCX”。 一、C简介 C &#xff08;c…

【分布式应用】ELK企业级日志分析系统

一、ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 1.1 ELK各组件介绍 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个…

Scala初识

1.scala简介 是一种多范式的编程语言&#xff0c;其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台&#xff08;Java虚拟机&#xff09;并兼容现有的Java程序。 scala特点 1.Scala是面向对象的 Scala是一种纯粹的面向对象语言&#xff0c;每一个…

Node.js 中的代码调试

目录 1、启用 Inspector 2、安全隐患 3、Inspector 客户端 4、启用远程调试的情形 5、以前的Debugger 1、启用 Inspector 当使用 --inspect 开关时&#xff0c;Node.js 进程开始侦听调试客户端&#xff0c;默认情况下侦听 127.0.0.1:9229 的域名和端口号&#xff1b;每个…

华为OD机试真题B卷 Java 实现【Linux 发行版的数量】,附详细解题思路

一、题目描述 Linux 操作系统有多个发行版&#xff0c;distrowatch.com 提供了各个发行版的资料。这些发行版互相存在关联&#xff0c;例如 Ubuntu 基于 Debian 只开发而 Mint 又基于 Ubuntu 开发&#xff0c;那么我们认为 Mint 同 Debian 也存在关联。 发行版集是一个或多个…

用Python求最大公约数和最小公倍数(51)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日主题 什么是最大公约数&#xff1f; 如何用Python求最大公约数&#xff1f; 什么是最小公倍数&#xff1f; 如何用Pyt…

chatgpt赋能python:Python中的连接符:介绍与应用

Python中的连接符&#xff1a;介绍与应用 在Python编程中&#xff0c;连接符起着关键性的作用&#xff0c;它是连接不同代码部分的纽带。本篇文章将重点介绍几种常用的Python连接符。 一、加号连接符&#xff08;&#xff09; 加号连接符最常见&#xff0c;用于连接不同的字…

一文读懂TSC时钟: (x86_64/arm64)实现介绍和编程使用

Linux(16)之Time Stamp Counter Author&#xff1a;Once Day Date&#xff1a;2023年5月30日 参考文档: 4. Environment Abstraction Layer — Data Plane Development Kit 23.03.0 documentation (dpdk.org)DPDK: lib/eal/include/generic/rte_cycles.h File Reference测量…

交换机安全功能介绍

今天海翎光电的小编来给大家聊聊以太网交换机安全功能。 交换机作为局域网中最常见的设备&#xff0c;在安全上面临着重大威胁&#xff0c;这些威胁有的是针对交换机管理上的漏洞&#xff0c;攻击者试图控制交换机。有的针对的是交换机的功能&#xff0c;攻击者试图扰乱交换机的…

新手快速学会使用DDL对数据库和表的操作

前言 SQL是一种操作关系型数据库的结构化查询语言。今天这篇文章将详细讲述数据定义语言DDL对数据库和表的相关操作。 文章目录 前言1. DDL-操作数据库1.1 查询1.2 创建数据库1.3 删除数据库1.4 使用数据库2.1 数据类型2.2 查询表2.3 创建表2.4 删除表2.5 修改表 3. 实战案例详…

统计学的假设检验/置信区间计算

假设检验的核心其实就是反证法。反证法是数学中的一个概念&#xff0c;就是你要证明一个结论是正确的&#xff0c;那么先假设这个结论是错误的&#xff0c;然后以这个结论是错误的为前提条件进行推理&#xff0c;推理出来的结果与假设条件矛盾&#xff0c;这个时候就说明这个假…

Navicat 15获取用户的密码

我使用Navicat连接好了mysql但是密码忘记了&#xff1b;可以通过如下操作找回密码 我使用的Navicat版本是 15.0.27 1、选择文件 --> 导出连接 2、选择你要知道密码的连接  勾选导出密码&#xff08;默认位置是桌面&#xff09; 3、 在Password 这栏找到加密后的密码 …

基于Android应用开发实现UWB(超宽带)通信

什么是超宽带UWB 超宽带通信是一种无线电技术,专注于设备之间的精确测距(测量位置的精度为 10 厘米)。这种无线电技术可以使用低能量密度进行短距离测量,并在大部分无线电频谱上执行高带宽信号传输。UWB 的带宽大于 500 MHz(或超过 20% 的小数带宽)。 从 Android 13 开…

[GXYCTF2019]Ping Ping Ping解题过程

1、来看看靶场 发现就只有这个提示&#xff0c;尝试一下在url输入框进行测试 页面返回ping的结果&#xff0c;然后我之前也做过另外一道类似的题 链接&#xff1a;[ACTF2020 新生赛]Exec1命令注入_[actf2020 新生赛]exec 1_旺仔Sec的博客-CSDN博客 尝试用管道符 果然是可以的…

chatgpt赋能python:Python中语句太长之续行符的使用

Python中语句太长之续行符的使用 如果你是一位有10年Python编程经验的工程师&#xff0c;那么你一定会遭遇语句太长的问题。这是导致程序出错的常见问题。在很多情况下&#xff0c;一条语句的长度会超过Python规定的最大长度&#xff0c;这时候我们就需要使用续行符进行换行了…

C语言——数据在内存中的存储(上)

数据在内存中的存储 1. 数据类型的介绍 之前已经介绍过C语言中的基本数据类型了&#xff0c;主要有&#xff1a; char //字符数据类型short //短整型int //整形long //长整型long long //更长的整形float //单精度浮点数double //双精度浮点数 注意&#xff1a;C语言中是是没…

JVM学习笔记(中)

1、垃圾回收算法 标记清除法 特点&#xff1a; 速度较快会产生内存碎片 注意&#xff1a;这里的清除并不是真正意义上的清除&#xff0c;即每个字节都清0&#xff0c;而是记录一下被清除的对象的起始和结束的地址&#xff0c;当下一次分配给一个新对象时&#xff0c;新对象…

一文看懂数字化转型丨三叠云

相信很多朋友在最近这几年对“数字化”、“数字化转型”等名词听得很多了吧&#xff0c;去网上搜搜“数字化转型”&#xff0c;这几年各式各样的信息如火如荼&#xff0c;充斥着互联网平台和大大小小的企业。 一、什么是数字化转型&#xff1f; 那么“数字化”和“数字化转型”…

【ros/ros2】LCN及ros2节点的LCN改写

文章目录 序言1. ros2两种节点类型2. LCN是什么3. LCN状态转换4. LCN状态转换要做的事5. LCN节点功能划分6. ros2节点的LCN改写 序言 背景&#xff1a;ros2节点改写为lifecycle node节点 1. ros2两种节点类型 Node&#xff1a;和ros1中一样的节点基类LifecycleNode&#xff…