C++ vector容器的常用用法_c++ vector修改数据可以直接赋值吗-程序员宅基地

技术标签: c++  

vector可以说是一个动态数组,它可以存储任何类型的数据,包括类!

使用vector需包含头文件#include< vector >.

定义

一、不带参数

// 定义了一个int类型的容器
vector<int> v1;

// 定义了一个double类型的容器
vector<double> v2;

注意事项:
容器可以使用数组方式获取它的值 和 给它赋值,但是得注意越界!

例如:
不可以使用数组方式给他赋值,因为容器并没有给他分配内容空间:

vector<int> v1;
// 不可以使用数组方式给他赋值,因为容器并没有给他分配内容空间
v1[0] = 1;	// error


// 可以使用数组方式给他赋值:
vector<int> v2(10);
v2[0] = 1;	// 正确

v2[11] = 11; // 错误,越界

二、带参数

  1. 定义了一个int类型的容器,定义时指定给他分配十个元素的空间
// 定义了一个int类型的容器,定义时指定给他分配十个元素的空间
vector<int> v1(10);

默认10个元素都是零值。

  1. 定义时指定10个元素的内存,同时给所有元素赋值666
vector<int> v3(10, 666);
  1. 定义时可以使用其他容器来初始化自己
vector<int> v1(5, 666);
// 定义时可以使用其他容器来初始化自己
vector<int> v2(v1);	// v1 和 v2 相等
  1. // 也可以使用 返回迭代器 的方式将一个容器的元素全都赋值给自己
vector<int> v1(5, 666);

vector<int> v2(v1.begin(), v1.end());
  1. begin 和 end 返回来的就是一个指针迭代器,所以可以进行加减操作,指向其他元素的位置
vector<int> v1(5, 666);

// 将v1的元素从第三个元素到最后的元素赋值给v2
vector<int> v2(v1.begin() + 2, v1.end());
  1. 可以使用数组来初始化容器
int Array[5] = {
    1, 2, 3, 4, 5};
// 将数组元素1,2,3,4给容器赋初值
vector<int> v1 = (Array, Array+3);

size 获取容器的元素个数

size()

vector<int> v1;

v1.size();

capacity 获取容器的大小

capacity()

vector<int> v1;

v1.capacity();

begin 获取容器第一个元素的迭代器

begin()

vector<int> v1(10, 666);

v1.begin();

end 指向容器最后一个元素的下一个位置的迭代器

end()

vector<int> v1(10, 666);

v1.end();

assign 赋值玩法

  1. 第一种玩法 会改变原来vector中的元素内存大小

将v1元素修改为5个,并且赋值888

vector<int> v1(10);

v1.assign(5, 888);	// 打印结果5个888
  1. 第二种玩法,使用迭代器赋值

将容器v2的10个1赋值给v1,使得v1和v2相等

vector<int> v1(5);
vector<int> v2(10, 1);

v1.assign(v2.begin(), v2.end());	// 打印结果10个1
  1. 第三种玩法,使用指针赋值

将数组的所有元素都赋值给v1

int Array[5] = {
     9, 8, 7, 6, 5 };
vector<int> v1;

v1.assign(Array, Array + 4);	// 打印结果9,8,7,6,5
  1. 第四种玩法,使用赋值运算符重载

将v1所有元素赋值给v2

vector<int> v1(10, 1);
vector<int> v2;

v2 = v1;	// 打印结果10个1

resize 将容器缩小和变大

一、把容器元素缩小

vector<int> v1(10);

v1.resize(5);	// 缩小长度为5

二、把容器扩大时,并给增加的元素赋值

vector<int> v1(5);

v1.resize(8, 111);	// 扩充v1容器的大小为8,后续新增加的使用111赋值

三、把容器扩大,不给增加的元素赋值

vector<int> v1(5);

v1.resize(15);

empty 判断容器是否为空

为空返回true,为假返回false

vector<int> v1(5);

if (v1.empty() == NULL) {
    
	cout << "v1为空!" << endl;
}

push_back 尾部添加一个元素

vector<int> v1;

v1.push_back(1);	// 在尾部增加要给1

pop_back 尾部删除一个元素

vector<int> v1(10);

v1.pop_back();	// 在尾部删除一个元素

at 和数组使用方式差不多

给第一个元素赋值1

vector<int> v1(10);

v1.at(0) = 1; 

打印输出容器里的所有元素

cout << "v1的所有元素:";
for (int i = 0; i < v1.size(); i++) {
    
	cout << v1.at(i) << ", ";
}

front 获取容器的第一个元素

vector<int> v1(10);

v1.front();

// 也可以使用他们赋值
v1.front() = 111;	// 给第一个元素赋值111

back 获取容器的最后一个元素

vector<int> v1(10);

v1.back();

// 也可以使用他们赋值
v1.back() = 222;	// 给最后一个元素赋值222

insert 元素的插入

vector<int> v1(10);

// 往第一个元素的位置插入一个5
v1.insert(v1.begin(), 5);


// 从第三个元素位置开始插入5个222
v1.insert(v1.begin() + 2, 5, 222);


vector<int> v2(3, 111);
// 从第二个元素开始插入v2的所有值
v1.insert(v1.begin() + 1, v2.begin(), v2.end());

erase 与 clear 元素删除

vector<int> v1(10);

// 删除第一个元素
v1.erase(v1.begin());

// 删除第一个到第三个元素
v1.erase(v1.begin(), v1.begin() + 3);

// 删除全部元素
v1.clear();

汇总代码:

#include <iostream>
#include <Windows.h>
#include <vector>

using namespace std;

// 不带参数的
void text1(void) {
    
	vector<int> v1;

	cout << "v1的元素个数:";
	cout << v1.size() << endl;

	cout << "v1容器的大小:";
	cout << v1.capacity() << endl;

	v1.push_back(1);
	v1.push_back(2);

	cout << endl << "v1插入两个元素后:" << endl;
	cout << "v1的元素个数:";
	cout << v1.size() << endl;

	cout << "v1容器的大小:";
	cout << v1.capacity() << endl;

	/*
	注意:
		不可以使用数组方式给他赋值,因为容器并没有给他分配内容空间:
			vector<int> v;
			v[0] = 1;	// error
	*/
}

// 带参数的
void text2(void) {
    
	vector<int> v2(10);	// 定义时指定给他分配十个元素的空间

	cout << "v2的元素个数:";
	cout << v2.size() << endl;

	cout << "v2容器的大小:";
	cout << v2.capacity() << endl;

	// 里面默认的值全为零
	cout << "v2里面的元素为:" << endl;
	vector<int>::iterator it = v2.begin();
	for (; it != v2.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;


	/*
	可以使用数组方式给他赋值:
		vector<int> v(10);
		v[0] = 1;	// 正确
	*/
	v2[0] = 1;	// 正确
	v2[1] = 2;
	cout << "v2里面的元素为:" << endl;
	it = v2.begin();
	for (; it != v2.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;

	/************************************************************************************************/

	vector<int> v3(10, 666);	// 定义时指定10个元素的内存,同时给所有元素赋值666
	cout << "v3里面的元素为:" << endl;
	it = v3.begin();
	for (; it != v3.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;

	/************************************************************************************************/

	vector<int> v4(v3);	// 定义时可以使用其他容器来初始化自己
	cout << "v4里面的元素为:" << endl;
	it = v4.begin();
	for (; it != v4.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;

	/************************************************************************************************/

	vector<int> v5(v2.begin(), v2.end());	// 也可以使用该种方式将v2的元素全都赋值给自己
	cout << "v5里面的元素为:" << endl;
	it = v5.begin();
	for (; it != v5.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;

	/************************************************************************************************/

	vector<int> v6(v2.begin() + 1, v2.end());	// begin返回来的就是一个指针迭代器,所以可以进行加1操作,指向下一个元素
	cout << "v6里面的元素为:" << endl;
	it = v6.begin();
	for (; it != v6.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;

	/************************************************************************************************/

	int text[10] = {
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	vector<int> v7(text, text + 5);	// 可以使用这种方式获取数组的值初始化自己(1,2,3,4,5)
	cout << "v7里面的元素为:" << endl;
	it = v7.begin();
	for (; it != v7.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;
}

// vector容器赋值assign玩法
void assign(void) {
    
	vector<int> v1(5);

	// 第一种玩法	会改变原来vector中的元素内存大小
	v1.assign(3, 8);
	cout << "玩法一:" << endl;
	vector<int>::iterator it = v1.begin();
	for (; it != v1.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;


	// 第二种玩法,使用迭代器赋值
	vector<int> v2(10, 1);
	v1.assign(v2.begin(), v2.end());
	cout << "玩法二:" << endl;
	it = v1.begin();
	for (; it != v1.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;


	// 第三种玩法,使用指针赋值
	int Array[5] = {
     9, 8, 7, 6, 5 };
	v1.assign(Array, Array + 2);
	cout << "玩法三:" << endl;
	it = v1.begin();
	for (; it != v1.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;


	// 第四种玩法,使用赋值运算符重载
	vector<int> v3;
	v3 = v1;
	cout << "玩法四:" << endl;
	it = v3.begin();
	for (; it != v3.end(); it++) {
    
		cout << *it << ", ";
	}
	cout << endl;
}

// resize将容器缩小和变大 与 empty判断容器是否为空
void text3(void) {
    
	vector<int> v1(10);
	
	// 一、把容器元素缩小
	cout << "v1的元素个数:" << v1.size() << endl;
	v1.resize(5);	// 调整他的元素个数为5
	cout << "v1的元素个数:" << v1.size() << endl;



	// 二、把容器扩大时,并给增加的元素赋值
	v1.resize(8, 111);	// 扩充v1容器的大小为8,后续新增加的使用111赋值
	cout << "v1的元素个数:" << v1.size() << endl;
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
    
		cout << v1[i] << ", ";
	}
	cout << endl;



	// 三、把容器扩大,不给增加的元素赋值
	v1.resize(15);
	cout << "v1的元素个数:" << v1.size() << endl;
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
    
		cout << v1[i] << ", ";
	}
	cout << endl;




	cout << endl << endl << "---empty---" << endl;
	// 判断容器是否为空
	vector<int> v2;

	if (v2.empty()) {
    
		cout << "v2为空!" << endl;
	}
}

// 尾部添加和删除
void text4(void) {
    
	vector<int> v1;

	cout << "v1的元素个数:" << v1.size() << endl;

	// 尾部添加一个元素
	v1.push_back(666);
	cout << "v1的元素个数:" << v1.size() << endl;

	// 尾部删除一个元素
	v1.pop_back();
	cout << "v1的元素个数:" << v1.size() << endl;
}

// at 与 front 与 back
void text5(void) {
    
	vector<int> v1(10);

	// 可以使用at修改容器里面的值,返回的是一个引用
	v1.at(0) = 888;
	// 和数组方式差不多
	v1[1] = 999;

	// 输出
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
    
		cout << v1[i] << ", ";
	}
	cout << endl;

	// 也可以使用at输出
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
    
		cout << v1.at(i) << ", ";
	}
	cout << endl;

	// 他们返回的都是一个引用
	cout << "第一个元素:" << v1.front() << endl;
	cout << "最后一个元素:" << v1.back() << endl;

	// 也可以使用他们赋值
	v1.front() = 111;
	v1.back() = 222;
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
    
		cout << v1.at(i) << ", ";
	}
	cout << endl;
}

// insert 元素的插入
void text6(void) {
    
	vector<int> v1(10);

	// 往第一个元素的位置插入一个5
	v1.insert(v1.begin(), 5);

	// 从第三个元素位置开始插入5个222
	v1.insert(v1.begin() + 2, 5, 222);

	vector<int> v2(3, 111);
	// 从第二个元素开始插入v2的所有值
	v1.insert(v1.begin() + 1, v2.begin(), v2.end());

	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
    
		cout << v1.at(i) << ", ";
	}
	cout << endl;
}

// 元素删除
void text7(void) {
    
	vector<int> v1(10);

	// 删除第一个元素
	v1.erase(v1.begin());

	// 删除第一个到第三个元素
	v1.erase(v1.begin(), v1.begin() + 3);

	// 删除全部元素
	v1.clear();
}

int main(void) {
    
	//text1();

	//text2();

	//assign();

	//text3();

	//text4();

	//text5();

	//text6();

	//text7();

	system("pause");
	return 0;
}

总结:

vector容器常用的函数已经列出来了,剩下还有很多个不常用的,就不说明了,需要用到的话,再另行百度吧!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cpp_learner/article/details/104589416

智能推荐

uni-app 消息推送功能UniPush_uniapp消息推送功能-程序员宅基地

文章浏览阅读5.7k次,点赞2次,收藏20次。这里用的是uni-app自带的UniPush1.0(个推服务),所以只针对UniPush1.0介绍实现步骤。当然现在已经出了UniPush2.0(HBuilderX 3.5.1及其以上版本支持),新项目的话还是推荐使用UniPush2.0。如果要使用UniPush2.0,请移步 UniPush 2.0 使用指南。_uniapp消息推送功能

sort与sorted的区别_sort和sorted函数的区别-程序员宅基地

文章浏览阅读1.3w次,点赞41次,收藏217次。一、sort()sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数原型:sort(key,reverse=False)key:用来指定一个函数,此函数在每次元素比较时被调用,此函数代表排序的规则,也就是你按照什么规则对你的序列进行排序;reverse:是用来表明是否逆序,默认的False情况下是按照升序的规则进行排序的,当reverse=True时,便会按照降序进行排序。例如:1、list=[2,24,8,6,35,7,22,30]list.sort()pri_sort和sorted函数的区别

Mutual Supervision for Dense Object Detection(ICCV2021)阅读笔记-程序员宅基地

文章浏览阅读299次。同上一篇一样,这边摸鱼笔记也是关于分类和回归分支的权重设计。Mutual Supervision for Dense Object Detection(ICCV2021)阅读笔记_mutual supervision for dense object detection

探索DLT645:一种智能电表通讯协议的实现-程序员宅基地

文章浏览阅读354次,点赞5次,收藏4次。探索DLT645:一种智能电表通讯协议的实现项目地址:https://gitcode.com/WKJay/DLT645在能源管理领域,尤其是在智能家居和工业自动化中,高效、准确的数据采集至关重要。DLT645 是一个专注于实现中国国家标准GB/T 18039.2-2008的开源库,它提供了一种与智能电表进行通讯的标准化方式。通过这个项目,开发者可以轻松地整合智能电表数据到他们的应用中。项目简..._645协议智能电表采集

Host碰撞环境搭建原理及复现-程序员宅基地

摘要:本文介绍了通过Host碰撞来找到隐藏业务的方法,通过配置域名字典进行碰撞,成功复现了2条数据。

SAP FIORI开发入门-徐春波-专题视频课程-程序员宅基地

文章浏览阅读1.4k次,点赞3次,收藏8次。【课程目标】打造一个简单实用的 SAP FIORI 入门开发课程,帮助广大 SAP 技术人员或者希望进入 SAP 技术领域的人打开一扇门。【课程形式】视频教程 + PDF 参考资料【学习门槛】零门槛,无需任何额外知识【作者微信】eksbobo【如何入群】使用购买课程的 ID 作为请求信息,发送到作者的微信添加好友,作者会把您拉入到这门课程的微信群中。..._sap fiori开发视频教程--由浅入深学习fiori开发

随便推点

携程 Apollo 配置中心 | 学习笔记 序章_apollo分布式配置黑马学习笔记-程序员宅基地

文章浏览阅读7.4k次,点赞11次,收藏45次。Apollo 携程Apollo配置中心目录导航 携程 Apollo 配置中心 | 学习笔记(一) | Apollo配置中心简单介绍 携程 Apollo 配置中心 | 学习笔记(二) | Windows 系统搭建基于携程Apollo配置中心单机模式 携程 Apollo 配置中心 | 学习笔记(三) | 自..._apollo分布式配置黑马学习笔记

什么是人工智能(AI)?—— 你需要知道的三件事-程序员宅基地

文章浏览阅读1.1k次,点赞16次,收藏25次。人工智能 (AI) 是对人类智慧行为的仿真。它通常是设计用来感知环境、了解行为并采取行动的一台计算机或一个系统。想想自动驾驶汽车:此类 AI 驱动系统将机器学习和深度学习等 AI 算法集成到支持自动化技术的复杂环境。据麦肯锡预计,到 2030 年,AI 的全球经济价值将高达 13 万亿美元。这是因为在 AI 浪潮的影响下,几乎各行各业乃至每一个应用领域的工程环节都在转型。除了自动驾驶以外,AI 还广泛应用于以下领域:机器故障预测模型,告知何时需要进行机器保养;健康和传感器分析,如病患监护系统;

VueRouter(vue-router 路由)最全笔记,实战实用,通俗易懂_router及vue-router教程-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏8次。VueRouter安装和使用vue-router安装模块化中使用使用vue-router的步骤使用history模式router-link重定向/默认路由点击事件跳转路由动态路由路由懒加载路由嵌套参数传递(一)路由元信息全局导航守卫前置全局后置钩子组件内守卫路由独享的守卫keep-alive注意URL:协议://主机:端口/路径?查询(query)所有的组件都继承自Vue类的原型打包:npm run buildredirect:[ˌriːdəˈrekt ] 重定向replace:没有返回箭头_router及vue-router教程

运维——1.网线接在家用无线路由器LAN口依然可以上网,什么原理_路由器为啥插lan口为什么还能上网-程序员宅基地

文章浏览阅读641次。这种连接方式实际上是将路由器作为一个普通的网络交换机来使用_路由器为啥插lan口为什么还能上网

element-ui的el-upload上传图片自定义请求和vue-quill-editor富文本结合使用_vue中使用el-upload自定义editor-程序员宅基地

文章浏览阅读293次。vue-quill-editor默认的图片插入方式,是直接将图片转成base64编码,这样的结果是整个富文本的html片段十分冗余。我们的服务器端接收的post的数据大小都是有限制的,这样的话导致提交失败,就算不提交失败,大量的数据存入数据库也不是好事。为了解决这个问题,我考虑了两个方案,换一个富文本编辑框框架,另一个是修改vue-quill-editor的框架代码。..._vue中使用el-upload自定义editor

HTML/CSS常见的三种水平居中方式(好文备忘)_htmlcss水平居中-程序员宅基地

文章浏览阅读125次。HTML/CSS常见的三种水平居中方式_htmlcss水平居中