c++之vector容器

news2025/2/23 23:33:56

1.简介

  向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

1.1 vector和普通数组区别

  普通数组是静态的,在初始化是就确定空间大小,不支持动态扩展;
  vector则可以看做是一个动态的数组,可以存放任意数据(基本数据类型和自定义数据类型均可以),支持动态扩展空间。

2.vector容器的构造函数

  vector容器,可以看做是一个单端数组,构造函数有:无参构造、有参构造、拷贝构造。

vector 容器:—>单端数组

  • vector和普通数组的区别:
    普通数组是静态空间,创建是就分配好
    vector支持动态扩展
  • vector容器常用迭代器:
    v.rend() -->指向第一个元素的前一个位置
    v.end() -->指向最后一个元素的下一个位置
    v.begin() -->指向第一个元素
  • vector容器的迭代器是支持随机访问的迭代器
  • vector构造函数:
    无参构造:vector< T > v;
    有参构造:vector(v.begin(),b.end()); --将begin到end之间的内容拷贝
         vector(n,elem); //将n个elem内容拷贝
    拷贝构造:vector(const vector &v);
  • vector构造函数使用示例:
#include < iostream >
using namespace std;
#include < vector >
void PrintVector(const vector< int >& ptr)
{
	//若传入的vector是一个常量,则才是需要迭代器是需要使用:const_iterator
	for ( vector< int >:: const_iterator v = ptr.begin(); v != ptr.end(); v++)
	{
		cout << *v << " ";
	} 
	cout << endl;
}
void test()
{
	vector< int > vtr;//默认构造
	for (int i = 0; i < 5; i++)
	{
		vtr.push_back(i);
	}
	PrintVector(vtr);
	vector< int > v2(vtr.begin(), vtr.end());//将begin~end之间的内容拷贝
	PrintVector(v2);
	vector< int > v3(10, 5);//赋值10个5
	PrintVector(v3);
	vector< int >v4(v3);//拷贝构造
	PrintVector(v4);
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

3.vector赋值

  vector赋值可以直接"="赋值,也可以使用成员函数assign赋值。


vector赋值:
	vector &operator=(const vector &v);//重载=
	assign(beg,end);//将beg~end区间进行赋值
	assign(n,elem);//n个elem赋值


  • 赋值操作示例:
#include < iostream >
using namespace std;
#include < vector >

void PrintVector(const vector< int >& p)
{
	for (vector< int >::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout << *ptr<< " ";	
	}
	cout << endl;
}
void test()
{
	vector< int > v;
	for (int i = 0; i < 5; i++)
	{
		v.push_back(i);
	}
	PrintVector(v);
	vector< int > v2 = v;//等号赋值
	PrintVector(v2);
	vector< int > v3(v.begin(), v.end());//区间赋值
	PrintVector(v3);
	vector< int > v4(5, 666);//5个666赋值
	PrintVector(v4);
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

4.vector获取容量和成员个数

  vector和普通数组一样,下标是从0开始的。获取容量大小使用capacity()函数,判断容器是否为空可以使用empty()函数,获取成员个数使用size()函数。还可以使用resize函数指定容器大小;

vector容器的容量和成员个数:
判断vector容器是否为空:empty()
容量:capacity()
容器中的元素个数:size()
指定容器长度为num:resize(int num);
	若容器变长,则以默认值填充,默认值为0
	若容器变小,则末尾超出的元素将被删除
指向容器的长度为num:resize(int num,elem);
	若容器变长,则用elem填充
	若容器变小,则末尾超出的元素将被删除
  • 使用示例:
#include < iostream >
using namespace std;
#include < vector >
void PrintVector(const vector< int >& p)
{
	for (vector< int >::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout << *ptr << " ";
	}
	cout << endl;
	cout << "容量:" << p.capacity();
	cout << endl;
	cout << "元素个数:" << p.size();
	cout << endl;
}
void test()
{
	vector< int > vtr;
	for (int i = 0; i < 5; i++)
	{
		vtr.push_back(i);
	}
	PrintVector(vtr);
	//指定容器长度
	vtr.resize(10,666);//指定长度为10,超出则用666填充
	PrintVector(vtr);
	vtr.resize(3);//指定长度小于实际长度,则会删除超出的元素,但空间超出的空间还是存在
	PrintVector(vtr);
	vector< int >v2;
	v2.resize(5);//没有指定填充值则默认为0
	if (v2.empty())
	{
		cout << "v2为空" << endl;
	}
	PrintVector(v2);
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述
  注意:在resize()函数时,若指定的大小比原空间大,则容器会进行扩充;若指定的大小比原空间小,则会将超出的成员删除,但空间大小不删除;

5.vector容器成员删除与插入

vector容器是一个单端数组,通过bush_back()函数可以实现从末尾插入数据。
pop_back()从末尾删除数据;
从指定位置插入数据可以使用insert()成员函数,该函数有多个重载版本。
要从指定位置删除数据可以使用erase()成员函数,该函数有多个重载版本;
clear()函数实现清空容器。

vector插入与删除:
	push_back();//尾插
	pop_back();//尾删
	insert(const_iterator pos,elem);//迭代器指向位置pos插入元素elem
	insert(const_iterator pos,int count,elem)//迭代器指向位置pos插入count个元素elem
	erase(const_iterator pos);//删除迭代器指向的元素
	erase(const_iterator start,const_iterator end);//删除迭代器start~end之间的元素
	clear();//删除容器中所有元素

  • 实现示例:
#include < iostream >
using namespace std;
#include < vector >
class Person
{
	friend ostream& operator<<(ostream& cout, const Person& per);
public:
	Person() {
	}
	Person(int age, string name) :age(age), name(name)
	{
	}
	Person& operator=(Person p)
	{
		this- >age = p.age;
		this->name = p.name;
		return *this;
	}
private:
	int age;
	string name;
};
ostream& operator< <(ostream& cout, const Person &per)
{
	cout << "姓名:" << per.name << "t年龄:" << per.age;
	return cout;
}
void PrintVector(const vector< Person >& p)
{
	for (vector< Person >::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout << *ptr << endl;
	}
}
void test()
{
	//实例化对象
	Person v1(18,"小王");
	Person v2(18, "小李");
	Person v3(18, "小刘");
	Person v4(18, "小陈");
	Person v5(18, "小蒋");
	Person v[5] = { v1,v2,v3,v4,v5 };
	for (int i = 0; i < sizeof(v) / sizeof(v[0]); i++)
	{
		cout < < v[i] < < endl;
	}
	cout << "--------------------vector-------------------" << endl;
	//创建容器
	vector< Person > vtr;
	//尾插
	for (int i = 0; i < 5; i++)
	{
		vtr.push_back(v[i]);//赋值
	}
	PrintVector(vtr);
	//尾删
	cout << "t尾删" << endl;
	vtr.pop_back();
	PrintVector(vtr);
	//插入
	cout << "t插入" << endl;
	Person temp(24, "老吕");
	vtr.insert(vtr.begin(), temp);
	PrintVector(vtr);
	cout << "t第三个位置插入3个值" << endl;
	vector< Person >::iterator ptr = vtr.begin();
	ptr += 3;
	vtr.insert(ptr, 3,temp);
	PrintVector(vtr);
	cout << "t删除首位置的值" << endl;
	vtr.erase(vtr.begin());
	PrintVector(vtr);

	cout << "t删除第3个位置到第6个位置的值" << endl;
	ptr = vtr.begin();
	vtr.erase(ptr+3, ptr+6);
	PrintVector(vtr);

	cout << "t清空" << endl;
	vtr.clear();//或者使用vtr.erase(vtr.begin(),vtr.end);
	PrintVector(vtr);
	cout << "空间大小:" << vtr.capacity();
	cout << endl;
	cout << "元素个数:" << vtr.size();
	cout << endl;
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

6.vector容器数据存取

  vector容器也可以像普通数组一样同[]访问成员,此外还可以使用at()成员函数实现数据读写;


vector数据存取
	at(int idx);//返回下标对应的内容
	operator[];//重载[]
	front();//返回容器中第一个元素
	back();//返回容器中最后一个元素

  • 实现示例:
#include < iostream >
using namespace std;
#include < vector >
#include < algorithm >

void PrintVector(int val)
{
	cout << val << " ";
}
void test()
{
	
	vector<int> vtr;
	for (int i = 0; i < 5; i++)
	{
		vtr.push_back(i);
	}
	for_each(vtr.begin(), vtr.end(), PrintVector);
	cout << endl;
	cout << "第一个值:" << vtr.front() << endl;
	cout << "最后一个值:" << vtr.back() << endl;
	vtr[0] = 100;
	cout << "vtr[0]=" << vtr.at(0) < < endl;
	
}

int main()
{
	test();
	system("pause");
}


在这里插入图片描述

7.vector容器互换元素

  在vector容器中,可以通过成员函数swap()函数实现两个容器的成员互换。
  注意:swap互换元素同时也可将空间大小进行互换。


vector容器互换
swap(vec);//将vec中的元素和本身的元素互换
注意:swap互换元素同时也可将空间大小进行互换

  • 使用示例:
#include < iostream >
#include < vector >
using namespace std;
void PrintVector(const vector<int>& p)
{
	for (vector<int>::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout << *ptr << " ";
	}
	cout << endl;
}
void test()
{
	vector<int> vtr(10,666);
	vector<int> vtr2;
	for (int i = 0; i < 5; i++)
	{
		vtr2.push_back(i);
	}
	cout << "\t互换前" << endl;
	PrintVector(vtr);
	PrintVector(vtr2);
	cout << "vtr大小:" << vtr.capacity() << "\t元素个数:"<<vtr.size()<<endl;
	cout << "vtr2大小:" << vtr2.capacity() << "\t元素个数:" << vtr2.size()<<endl;
	cout << "\t互换后" << endl;
	vtr2.swap(vtr);
	PrintVector(vtr);
	PrintVector(vtr2);
	cout << "vtr大小:" << vtr.capacity() << "\t元素个数:" << vtr.size() << endl;
	cout << "vtr2大小:" << vtr2.capacity() << "\t元素个数:" << vtr2.size() << endl;
}
//通过swap互换元素同时互换空间
void test02()
{
	vector<int>vtr;
	//初始化
	for (int i = 0; i < 100000; i++)
	{
		vtr.push_back(i);
	}
	cout << "vtr大小:" << vtr.capacity() << "\t元素个数:" << vtr.size() << endl;
	vtr.resize(5);//重新指定长度为5
	cout << "vtr大小:" << vtr.capacity() << "\t元素个数:" << vtr.size() << endl;
	vector<int>(vtr).swap(vtr);
	/*
	vector<int>(vtr) --使用匿名对象,将匿名对象初始化为vtr

	vector<int>(vtr).swap(vtr);  --在通过swap函数和匿名对象互换,此时即可实现收缩内存
	*/
	cout << "vtr大小:" << vtr.capacity() << "\t元素个数:" << vtr.size() << endl;
}
int main()
{
	test();
	cout << "------------------test02示例------------------------" << endl;
	test02();
	system("pause");
}

在这里插入图片描述
  由于swap函数不仅可以互换元素,而且空间也大小也是可以互换的,所以有些清空下可以使用swap()函数来合理使用空间,避免空间资源浪费。

8.vector容器预留空间

reserve()成员函数可以指定空间大小,为vector容器预留空间。
reserve函数和resize()函数区别:
resize()函数指定大小后会直接初始化空间;
reserve()函数指定的大小不会初始化空间,预留的空间不能直接访问,必须在赋值之后采用访问。
reserve(int len);//容器预留len长度的元素,预留位置初始化,元素不可访问
  • 使用示例:
#include < iostream >
using namespace std;
#include < vector >
void test()
{
	vector<int>vtr;
	vtr.reserve(10);
	cout << "空间大小:" << vtr.capacity() << "元素个数:"<<vtr.size()<<endl;
	vector<int> vtr2;
	vtr2.resize(10);//指定长度
	cout << "空间大小:" << vtr2.capacity() << "元素个数:" << vtr2.size() << endl;
}

void test02()
{
	vector<int> vtr;
	int* p=NULL;
	cout << "不适用预留空间:" << endl;
	int num = 0;
	for (int i = 0; i < 100000; i++)
	{
		vtr.push_back(i);
		if (p != &vtr[0])
		{
			p = &vtr[0];
			num++;
		}
	}
	cout << "动态扩展空间次数:" << num<<endl;

	vector<int> vtr2;
	vtr2.reserve(100000);//预留100000空间
	p = NULL;
	cout << "使用预留空间:" << endl;
	num = 0;
	for (int i = 0; i < 100000; i++)
	{
		vtr2.push_back(i);
		if (p != &vtr2[0])
		{
			p = &vtr2[0];
			num++;
		}
	}
	cout << "动态扩展空间次数:" << num << endl;

}
int main()
{
	test();
	cout << "\t示例2:" << endl;
	test02();
	system("pause");
}

在这里插入图片描述
  vector容器空间是根据成员来动态扩展,若一开始就知道使用的空间大概需要多大,则可以使用reserve()函数来指定,从而可以减少中间动态扩展的次数。

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

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

相关文章

HyperAI超神经 x 中国信通院 | 可信开源大模型案例汇编(第一期)案例征集计划正式启动自定义目录标题)

为进一步促进大模型的开源和合作&#xff0c;引导开源大模型产业健康规范发展&#xff0c;中国信息通信研究院现开启「可信开源大模型案例汇编&#xff08;第一期&#xff09;」的案例征集计划。 HyperAI超神经将以合作伙伴的身份&#xff0c;协助调研国产开源大模型的技术细节…

敏捷开发用户故事

产品Backlog中的需求通常使用用户故事来表达。 用户故事是从用户&#xff08;需求方&#xff09;的视角描述对用户有价值的需求 Who 这个需求为谁服务 What 具体要做什么 Why 目的是什么 一个典型的用户故事会以如下形式表达&#xff1a; 用户故事格式示例&#xff1a; 作…

基于SC-LeGO-LOAM的建图和ndt_localizer的定位

link 基于SC-LeGO-LOAM的建图和ndt_localizer的定位 链接: link. SC-LeGO-LOAM 链接: link. ndt_localizer 将建图和定位两部分分开&#xff0c;利用SC-LeGO-LOAM进行建图&#xff0c;相比于LeGO-LOAM&#xff0c;其采用了Scan Context方法&#xff0c;对点云地图进行闭环检测和…

5G智能安全帽_实时对讲/视频通话/高精度定位_智能安全帽功能介绍

5G智能安全帽是一种具有工业级高清晰度摄像头和5G/WIFI网络功能的产品。在传统安全帽的基础上&#xff0c;智能安全帽集成了摄像头、语音和通信主板等模块。它具备高清视频采集、语音通讯、对讲、本地视频存储等功能&#xff0c;通过这种佩戴式设备&#xff0c;不仅可以实现数据…

app逆向之charles配置

声明&#xff1a;本文仅限学习交流使用&#xff0c;禁止用于非法用途、商业活动等。否则后果自负。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01;本教程也没有专门针对某个网站而编写&#xff0c;单纯的技术研究 目录 charles配置手机配置 charles配置 最近有点…

瑞数专题五

今日文案&#xff1a;焦虑&#xff0c;想象力过度发酵的产物。 网址&#xff1a;https://www.iyiou.com/ 专题五主要是分享瑞数6代。6代很少见&#xff0c;所以找理想哥要的&#xff0c;感谢感谢。 关于瑞数作者之前已经分享过4篇文章&#xff0c;全都收录在瑞数专栏中了&am…

arcpy.message实现探索

arcpy 位置D:\Program Files\GeoScene\Pro\Resources\ArcPy\arcpy\__init__.py ”““AddMessage(消息) 创建可以使用任何GetMessages函数访问的地理处理信息消息(Severity0)。 message(字符串):要添加的消息。”“ arcpy.geoprocessing D:\Program Files\GeoScene\Pro\Re…

求购供应发布农业副业产品市场行情小程序开发

农业副业产品求购供应发布市场行情小程序H5开源版开发 后台同步&#xff1a;一键获取全国近200家农产品批发市场的商品价格&#xff0c;包括蔬菜、水果、水产、粮油和农副产品等。 实时更新和同步市场价格动态&#xff0c;保障信息的准确性和时效性。 前端VIP权益功能&…

WPF RelativeSource属性-目标对象类型易错

上一篇转载了RelativeSource的三种用法&#xff0c;其中第二种用法较常见&#xff0c;这里记录一下项目中曾经发生错误的地方&#xff0c;以防自己哪天忘记了&#xff0c;又犯了同样错误—WPF RelativeSource属性-CSDN博客 先回顾一下&#xff1a; 控件关联其父级容器的属性—…

利用Graviton2和S3免费套餐搭建私人网盘

网盘是一种在线存储服务&#xff0c;提供文件存储&#xff0c;访问&#xff0c;备份&#xff0c;贡献等功能&#xff0c;是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制&#xff0c;比如限制下载速度&#xff0…

C语言 Number 1 基本数据类型

数据类型的定义 c语言的数据分类基本类型整型浮点型float和double的精度和范围范围精度 枚举类型空类型派生类型派生的一般表达形式 注 c语言的数据分类 首先是针对C语言的数据类型做个整理 大致分为四个大类型 基本类型枚举类型空类型派生类型 那么根据以上四个大类型 我们…

万物摩尔定律:人工智能技术的快速迭代将使人类万劫不复?

第一次工业革命&#xff1a;蒸汽机时代&#xff1b; 第二次工业革命&#xff1a;电气化时代&#xff1b; 第三次工业革命&#xff1a;信息化时代&#xff1b; 第四次工业革命&#xff1a;智能化革命。这一场革命正在上演&#xff0c;是人工智能&#xff08;AI&#xff09;带…

预处理详解(一)

1 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C&#xff0c;其值为1&#xff0c;否则未定义 这些预定义符号都是…

试题二(15分)和试题三(15分) (软件设计师笔记)

&#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609; 在csdn获奖荣誉: &#x1f3c6;csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣…

Web安全系列——XSS攻击

文章首发公众号&#xff1a; 海天二路搬砖工 一、什么是XSS攻击 XSS &#xff08;Cross-site scripting&#xff09;攻击&#xff0c;即跨站脚本攻击。 攻击者通过在受害者的浏览器中注入恶意代码&#xff0c;攻击受害者的登录凭证、盗取敏感信息或控制受害者的会话等。 XS…

泛微e-office download.php任意文件

0x01 应用介绍 泛微e-office系统是标准、易用、快速部署上线的专业协同OA软件,国内协同OA办公领域领导品牌,致力于为企业用户提供专业OA办公系统、移动OA应用等协同OA整体解决方案 0x02 影响版本及语法特征 泛微e-offcie9 fofa&#xff1a;app”泛微-EOffice” && b…

掌握 JavaScript 的基本语法

一、javascript书写位置 JavaScript 可以写在 HTML 页面中的以下三个位置&#xff1a; 内联脚本&#xff1a;将 JavaScript 代码直接写在 HTML 元素的 onclick、onload、onsubmit 等事件属性中。例如&#xff1a; <button onclick"alert(Hello World)">点击我…

测试遇到bug怎么分析,这可能是我看到最专业的总结了!

为什么定位问题如此重要&#xff1f; 可以明确一个问题是不是真的“bug” 很多时候&#xff0c;我们找到了问题的原因&#xff0c;结果发现这根本不是bug。原因明确&#xff0c;误报就会降低多个系统交互&#xff0c;可以明确指出是哪个系统的缺陷&#xff0c;防止“踢皮球”&…

前端如何不变形的渲染图片大小和图片上的内容

在做前端项目时可能经常会页面图片大小变形或者压缩的情况&#xff0c;一般情况就是height给100%&#xff0c;width给auto就可以了满足大部分使用情况了。有时候需要做一些比较复杂的功能&#xff0c;比如需要在图片上增加锚点&#xff0c;而且图片在适配各种屏幕大小时&#x…