STL容器之vector

news2024/11/27 11:52:21

1、构造初始化

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

void PrintVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	//构造函数原型:
	//vector<T> v;					 //采用模板实现类实现,默认构造函数
	//vector(v.begin(), v.end());	//将v[begin(), end())区间中的元素拷贝给本身
	//vector(n, elem);				//构造函数将n个elem拷贝给本身
	//vector(const vector &vec);	//拷贝构造函数


	vector<int> v1;											//默认构造
	int arr[] = { 10,20,30,40 };
	vector<int> v2(arr, arr + sizeof(arr) / sizeof(int));	//数组构造
	vector<int> v3(v2.begin(), v2.end());					//迭代器构造
	vector<int> v4(v3);										//拷贝构造
	PrintVector(v2);
	PrintVector(v3);
	PrintVector(v4);
}

int main()
{
	test01();


	return 0;
}

2、赋值操作

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

void PrintVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	//vector& operator=(const vector &vec);	//重载等号操作符
	//assign(beg, end);						//将[beg, end)区间中的数据拷贝赋值给本身
	//assign(n, value);						//将n个value拷贝赋值给本身

	int arr[] = { 10, 20, 30, 40 };
	vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));	//默认构造

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

	//assign():
	vector<int> v3;
	v3.assign(5, 1000);	//也即是5个元素,都是1000

	//重载 = 运算符
	vector<int> v4;
	v4 = v3;

	//交换
	int array[] = { 100, 200, 300, 400 };
	vector<int> v5(array, array + sizeof(array) / sizeof(int));
	v5.swap(v1);


	PrintVector(v1);
	PrintVector(v2);
	PrintVector(v3);
	PrintVector(v4);
	PrintVector(v5);
}

int main()
{
	test01();


	return 0;
}

3、容量和大小

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

void PrintVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	//empty();						//判断容器是否为空
	//capacity();					 //容器的容量
	//size();						//返回容器中元素的个数
	//resize(int num);				//重新指定容器的长度为num,若容器变长,则以默认值0填充新位置;
															//若果容器变短,则末尾超出容器长度的元素被删除。

	//resize(int num, elem);		//重新指定容器的长度为num,若容器变长,则以指定值elem填充新位置;
															//如果容器变短,则末尾超出容器长度的元素被删除。
	vector<int> v;
	for (int i = 1; i <= 4; i++)
		v.push_back(i * 10);

	cout << "capacity: " << v.capacity() << endl;
	cout << "size: " << v.size() << endl;
	cout << "empty? " << v.empty() << endl;
	PrintVector(v);
	cout << "----------------------------------------" << endl;
	v.resize(6);		//变长,新位置填充默认0
	PrintVector(v);
	//cout << v.size() << endl;			//6
	//cout << v.capacity() << endl;		//6
	v.resize(2);		//变短,删除末尾4个元素
	PrintVector(v);
	//cout << v.size() << endl;			//2
	//cout << v.capacity() << endl;		//6

	cout << "----------------------------------------" << endl;
	v.resize(4, 88);	//变长,新位置填充为指定值88
	PrintVector(v);
	v.resize(2);		//变短,删除末尾2个元素
	PrintVector(v);


}


int main()
{
	test01();
	return 0;
}

4、存取操作

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

void PrintVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	//at(int idx);	 //返回索引idx所指的数据
	//operator[];	 //返回索引idx所指的数据
	//front();		//返回容器中第一个数据元素
	//back();		//返回容器中最后一个数据元素


	int array[] = { 100, 200, 300, 400 };
	vector<int> v(array, array + sizeof(array) / sizeof(int));
	for (int i = 0; i < v.size(); i++)
		cout << v[i] << " ";
	cout << endl;
	cout << "------------" << endl;
	for (int i = 0; i < v.size(); i++)
		cout << v.at(i) << " ";
	cout << endl;

	cout << v.front() << endl;
	cout << v.back() << endl;
}

int main()
{
	test01();


	return 0;
}

5、插入删除操作

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

void PrintVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	//push_back(elem);									//尾部插入元素
	//insert(const_iterator pos, elem);					//迭代器指向位置pos插入元素elem
	//insert(const_iterator pos, int count, elem);		//迭代器指向位置pos插入count个元素elem
	//insert(pos, beg, end);							//在pos位置的前面插入[beg,end)区间的数据,无返回值

	//pop_back();										//删除最后一个元素
	//erase(const_iterator pos);						//删除迭代器指向的元素
	//erase(const_iterator start, const_iterator end);	//删除迭代器从start到end之间的元素
	//clear();											//删除容器中所有元素
	int array[] = { 10, 20, 30, 40 };
	vector<int> v(array, array + sizeof(array) / sizeof(int));

	//insert():可以这么理解,在迭代器指向的位置的前面插入元素
	v.insert(v.begin(), 336);		
	PrintVector(v);	//336,10,20,30,40
	v.insert(v.begin() + 2, 100);	//vector支持随机访问,否则不能直接+2,,,,等操作
	PrintVector(v);	//336,10,100,20,30,40
	//支持数组下标的,一般都支持随机访问;此时迭代器可以直接+2,-3,+5,,,等操作
	v.insert(v.begin() + 1, 3, 88);
	PrintVector(v);
	v.insert(v.begin(), array, array + sizeof(array) / sizeof(int));
	PrintVector(v);


	cout << "----------------------------------" << endl;
	//删除操作:erase()
	v.erase(v.begin());
	PrintVector(v);
	v.erase(v.begin()+2, v.begin() + 6);	//实际上就是[begin,end)这个区间元素
	PrintVector(v);							
	v.clear();
	PrintVector(v);
	cout << "size: " << v.size() << endl;
}

int main()
{
	test01();
	return 0;
}

6、利用swap缩减空间

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

void PrintVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void PrintVector(vector<int>&& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int> v;
	for (int i = 0; i < 100000; i++)
		v.push_back(i);
	cout << "size: " << v.size() << endl;
	cout << "capacity: " << v.capacity() << endl;

	cout << "--------------------------" << endl;
	v.resize(10);
	cout << "size: " << v.size() << endl;
	cout << "capacity: " << v.capacity() << endl;
	PrintVector(v);

	cout << "------------缩减空间容量------------" << endl;
	//PrintVector(vector<int>(v));
	//cout << vector<int>(v).size() << endl;
	vector<int>(v).swap(v);
	cout << "size: " << v.size() << endl;
	cout << "capacity: " << v.capacity() << endl;
}

int main()
{
	test01();


	return 0;
}

7、reverse预留空间

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

void PrintVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int> v;
	int count = 0;			//统计空间扩展次数
	int* p = NULL;
	v.reserve(100000);		//预留空间
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			count++;
		}
	}
	cout << "count: " << count << endl;
	//vector动态扩展原理:
	//并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间!

	//预留空间reverse的作用:减少vector在动态扩展容量时的扩展次数!
	//如果数据较大,可以一开始就利用revese预留空间!
}


int main()
{
	test01();
	return 0;
}

8、自动扩增

//自动扩增
//当容量不够时,将以当前容量的2倍进行容量扩增!(错误,通过实验发现,并不是以2的倍数进行扩增的)
void test01()
{
	vector<int> v;
	cout << "capacity:" << v.capacity() << endl;
	v.push_back(1);
	cout << "capacity:" << v.capacity() << endl;
	v.push_back(2);
	cout << "capacity:" << v.capacity() << endl;
	v.push_back(3);
	cout << "capacity:" << v.capacity() << endl;
	v.push_back(4);
	cout << "capacity:" << v.capacity() << endl;
	v.push_back(5);
	cout << "capacity:" << v.capacity() << endl;
	v.push_back(6);
	cout << "capacity:" << v.capacity() << endl;
	v.push_back(7);
	cout << "capacity:" << v.capacity() << endl;
	v.push_back(8);
	cout << "capacity:" << v.capacity() << endl;
	v.push_back(9);
	cout << "capacity:" << v.capacity() << endl;
	v.push_back(10);
	cout << "capacity:" << v.capacity() << endl;
	//插入1, 2, 3, 4的时候,容量每次扩增一个,
	//当插入5的时候,容量扩增了2个,
	//当插入7的时候,容量扩增了3个!
	//当插入10的时候,容量扩增了4个!
}

在这里插入图片描述

9、遍历


//反向迭代器reverse_iderator
void test02()
{
	//正向迭代器遍历
	vector<int> v; 
	for (int i = 0; i < 5; i++)
		v.push_back(i);
	cout << "-----------------iterator-------------------------" << endl;

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
		cout << *it << " ";
	//使用反向迭代器遍历
	cout << endl << "-----------------reverse_iterator-------------------------" << endl;
	for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); rit++)
		cout << *rit << " ";
	cout << endl;
}

/*普通迭代器 和 常迭代器*/
void test03()
{
	cout << "普通对象 对应于 普通迭代器!" << endl;
	cout << "常对象   对应于 常迭代器!" << endl;
	cout << "--------------------普通对象下的迭代器--------------------" << endl;
	vector<int> v1(5,3); 				//普通对象
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << *it << " ";
	}

	cout << endl << "---------------------常对象下的迭代器--------------------" << endl;
	const vector<int> v2(5, 2);		//常对象
	for (vector<int>::const_iterator c_it = v2.begin(); c_it != v2.end(); c_it++)
	{
		cout << *c_it << " ";
	}
	cout << endl;
}

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

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

相关文章

Linux Shell 编程入门

从程序员的角度来看&#xff0c; Shell本身是一种用C语言编写的程序&#xff0c;从用户的角度来看&#xff0c;Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行&#xff0c;又可以利用 Shell脚本编程&#xff0c;完成更加复杂的操作。在Linux GUI日益完善的今天…

MyBatics-学习笔记

文章目录 1.概念介绍2.Mybatis快速入门1.创建用户表2.创建模块导入坐标3.编写配置文件4.编写sql映射文件5.编码 3.Mapper代理开发4.MyBatis核心配置文件5.商品增删改查案例&#xff08;重点&#xff09;6.参数传递6.2 多个参数 1.概念介绍 概念 MyBatis 是一款支持普通 SQL 查询…

【构建卷积神经网络】

构建卷积神经网络 卷积网络中的输入和层与传统神经网络有些区别&#xff0c;需重新设计&#xff0c;训练模块基本一致 全连接层&#xff1a;batch784&#xff0c;各个像素点之间都是没有联系的。 卷积层&#xff1a;batch12828&#xff0c;各个像素点之间是有联系的。 impor…

LaTex使用技巧21:设置中文环境、字体、行间距和页边距

我在Overleaf上编写我的中文LaTex&#xff0c;设置了中文环境&#xff0c;字体、行间距以及页间距&#xff0c;记录一下方便以后查询。 使用中文环境命令为&#xff1a; \usepackage{xeCJK}可以使用Overleaf上支持的中文字体Fonts for CJK Chinese&#xff0c;设置字体的命令…

探究使用HTTP爬虫ip后无法访问网站的原因与解决方案

在今天的文章中&#xff0c;我们要一起来解决一个常见问题&#xff1a;使用HTTP爬虫ip后无法访问网站的原因是什么&#xff0c;以及如何解决这个问题。我们将提供一些实际的例子和操作经验&#xff0c;帮助大家解决HTTP爬虫ip无法访问网站的困扰。 1、代理服务器不可用 使用HT…

Debian 12.1 正式发布

导读Debian 12.1 现已发布&#xff0c;这是对稳定发行版 Debian 12&#xff08;代号 Bookworm &#xff09;的首次更新。本次发布主要增加了安全问题的修正&#xff0c;并对严重问题进行了一些调整。 一些更新内容包括&#xff1a; 妥善处理系统用户的创建&#xff1b;修复 eq…

ChatGLM-RLHF(五)-PPO(Proximal Policy Optimization)原理实现代码逐行注释

一&#xff0c;前言 从open AI 的论文可以看到&#xff0c;大语言模型的优化&#xff0c;分下面三个步骤&#xff0c;SFT&#xff0c;RM&#xff0c;PPO&#xff0c;我们跟随大神的步伐&#xff0c;来学习一下这三个步骤和代码实现&#xff0c;本章介绍PPO代码实现。 上章我们…

Java编程实践:实现Java接口的方法也建议加上@Override注解

说明 作为一个Java编程实践&#xff0c;实现接口的方法也强烈建议加上Override注解。这样做的好处&#xff1a; 阅读代码的时候&#xff0c;一眼就能看出来是新增的函数&#xff0c;还是实现接口的函数。加上Override注解&#xff0c;如果拼写错误&#xff0c;编译器马上就能…

电视盒子哪款好?内行整理超值网络电视盒子推荐

从事电视盒子这行已经五年了&#xff0c;很多朋友在挑选电视盒子时会咨询我的意见&#xff0c;我耗费半个月时间整理了超值网络电视盒子推荐&#xff0c;盘点目前最值得入手的五款电视盒子机型&#xff0c;想买电视盒子不知道电视盒子哪款好可以从下面五款中挑选&#xff1a; 榜…

VIM 编辑器: Bram Moolenaar

VIM 用了很长时间&#xff0c; 个人的 VIM 配置文件差不多10年没有更新了。以前写程序的时候&#xff0c; 编辑都用这个。 linux kernel&#xff0c; boost规模的代码都不在话下。现在虽然代码写的少了&#xff0c;依然是我打开文件的首选。 现在用手机了&#xff0c;配个蓝牙键…

idea中如何处理飘红提示

idea中如何处理飘红提示 在写sql时&#xff0c;总是会提示各种错误 查找资料&#xff0c;大部分都是说关提示&#xff0c;这里把错误提示选择为None即可 关掉以后&#xff0c;也确实不显示任何提示了&#xff0c;但总有一种掩耳盗铃的感觉 这个sms表明明存在&#xff0c;但是还…

android studio安卓真机调试

把usb 手机开启到usb调试模式,然后用usb线连接手机 安装adb 如果下载速度很慢,请使用vpn 终端需要先安装brew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"使用brew安装adb brew install android-platfor…

面试遇到登录功能测试用例设计,你回答对了吗

给你一个登录功能&#xff0c;如何设计测试用例 哪怕是最常用最小的一个登录功能&#xff0c;其实涉及到的测试用例也是非常多的&#xff0c;这个题目通常会通过面试来考察求职者的综合能力&#xff0c;尤其是测试用例的设计思维&#xff0c;因为你即使你背了各种测试用例设计…

开发一款保护程序检测进程假死,精准打开保护的程序

网上很多保护程序都收费, 有免费的,可以将一般程序改成windows服务,我没用,应该很强大 功能点: 1,首先要有能加入保护程序的功能 2,不断的轮询检测程序是否已经运行 3,不断的轮询检测程序是否假死 4,一些其他检测 将保护的程序存入文件列表 保护程序运行时加载…

嵌入式开发学习(STC51-9-led点阵)

内容 点亮一个点&#xff1b; 显示数字&#xff1b; 显示图像&#xff1b; LED点阵简介 LED 点阵是由发光二极管排列组成的显示器件 通常应用较多的是8 * 8点阵&#xff0c;然后使用多个8 * 8点阵可组成不同分辨率的LED点阵显示屏&#xff0c;比如16 * 16点阵可以使用4个8 *…

恒盛策略:医药股反弹,掀涨停潮!

今天上午A股商场涨跌互现&#xff0c;上证指数一度显着跌落&#xff0c;但临近上午收盘时翻红。 作为行情风向标&#xff0c;券商板块盘中一度大幅跌落&#xff0c;但随后快速收窄跌幅&#xff0c;板块内分解较为显着&#xff0c;其中市值超越1000亿元的龙头券商之一的中金公司…

OPENCV C++(八)HOG的实现

hog适合做行人的识别和车辆识别 对一定区域的形状描述方法 可以表示较大的形状 把图像分成一个一个小的区域的直方图 用cell做单位做直方图 计算各个像素的梯度强度和方向 用3*3的像素组成一个cell 3*3的cell组成一个block来归一化 提高亮度不变性 常用SVM分类器一起使用…

HTML Emoji和Emoji 参考手册

HTML表情可以用来在网页中插入各种表情符号图标&#xff0c;丰富了网页表现形式和视觉效果。下面是一些常用HTML表情代码大全&#x1f4dc; Emoji 参考手册 HTML Emoji 扩展&#xff1a;&#x1f4cc; HTML 自定义实现emoji - (freesion.com)

native vlan tag设置错误,导致交换机无法访问

一同事找来&#xff0c;说他的一个测试交换机&#xff0c;下挂一些测试设备&#xff0c;能正常访问&#xff0c;但交换机的ip192.168.100.128却无法telnet访问&#xff0c;ping过去显示无法访问目的主机&#xff0c;让给看一下原因&#xff1f; 已知组网这个交换机接在交换机的…

用于实体对齐的联合学习实体和关系表示2019 AAAI 8.7+8.8

用于实体对齐的联合学习实体和关系表示 摘要介绍相关工作实体对齐图卷积网络 问题公式我们的方法整体架构初步实体对齐图卷积层对齐训练 近似关系表示联合实体和关系对齐 实验总结 摘要 实体对齐是在不同知识图之间集成异构知识的一种可行方法。该领域的最新发展通常采用基于嵌…