C++:STL:常用容器(上):vector

news2024/11/18 21:33:02

1:vector基本概念

功能:vector 数据结构和数组非常相似,也称为 单端数组.

vector 与普通数组区别:

1: 数组是静态空间,而 vector 可以动态扩展 

2: 动态扩展:并不是在原空间之后接新空间,而是找到更大的内存空间,然后将原数据拷贝到新空间。

 

vector 数据结构

vector 容器的迭代器支持随机访问,即可以跳越地访问容器元素,而不必逐个访问。 

1.2 :vector  构造函数

功能描述:创建vector

函数原型

vector<T> V  // 采用模板实现类实现,默认构造函数

vector(v.begin() , v.end())  // 将 v[begin(),end()] 区间中的元素拷贝给本身

vector(n,elem)   // 构造函数将 n 个 elem元素拷贝给本身

vector(const vector & vec)  // 拷贝构造函数

案例:测试几种构造函数

 

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

void test() {
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	printVector(v);

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

	vector<int> v3(2, 100);
	printVector(v3);

	vector<int> v4(v3);
	printVector(v4);
}

1.3 :vector赋值操作 

功能描述:给vector 容器进行赋值

函数原型:

vector&  operator=(const vector& v)  // 重载等号操作符

assign(beg, end)   // 将[beg,end] 区间中的数据拷贝赋值给本身

assign(n, elem)  //将 n个 elem 元素拷贝赋值 给本身

案例:测试 vector 的几种赋值操作

#include<iostream>
#include<string>
#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 test() {
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	printVector(v);

	//  vector&  operator=(const vector& v)  重载等号操作符
	vector<int> v2 = v;
	printVector(v2);

	vector<int> v3;
	v3.assign(v.begin(), v.end());
	printVector(v3);

	vector<int> v4;
	v4.assign(2, 100);
	printVector(v4);

}

int main() {
	test();
}

1.4 :vector容量大小 

功能描述:对vector 容器的容量和大小进行操作

函数 原型:

empty()   //   判断容器是否为空

capacity()  // 容器的容量

size()   //  放回容器中元素的 个数

resize(int num)  // 重新指定容器 的长度 num , 若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超出容器 长度的元素被删除。

resize(int num,elem)  // 重写指定容器的长度 num , 若容器 变长,则以elem 值填充新位置,如果容器变短,则末尾超出容器 长度的元素被删除

案例:测试 vector容量相关的操作

通过运行结果可知:

1:resize改变的是 vector 的大小,而不是容量

2:如果resize 后vector 的大小增加,并超过原来的容量,则会自动增加容量。

3:如果resize后 vector的大小减少,则容量不变

4:容量不等于 size

1.5 :vector 插入和删除 

功能描述: 对vector 容器进行插入,删除操作

函数原型:

push_back(ele)  // 尾部插入 元素ele

pop_back()  // 删除最后一个元素

insert(const _iterator pos,ele)  // 迭代器指向位置pos并插入元素 ele

erase(const_iterator pos) // 删除迭代器指向的元素

erase(const_iterator start, const_iterator  end) // 删除迭代器从start 到end 之间  的元素

clear()   // 删除 容器中所有元素

案例 :测试 vector的删除和插入操作

void test2() {
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	// 弹出最后一个元素
	v1.pop_back();
	v1.pop_back();
	printVector(v1);

	// 在首个元素处 插入 100
	v1.insert(v1.begin(), 100);
	printVector(v1);

	// 在首个元素处插入2个 200
	v1.insert(v1.begin(), 2, 100);

	// 删除最后两个元素
	v1.erase(v1.end() - 2, v1.end());

	// 清空vector,并不会改变 vector的容量
	v1.clear();
	printVector(v1);
	cout << "v1的大小为:" << v1.size() << endl;
	cout << "v1的容量为:" << v1.capacity() << endl;
}

 1.6:vector数据存取

功能描述: 对vector 中的数据的存取操作 

函数原型

at(int idx)   //返回索引idx 所指的数据

operator[idx]  // 返回索引 idx所指的数据

front()    //返回容器中的第一个数据

back()    // 返回容器中最后一个 数据元素

void test3() {
	vector<int> v1;
	for (size_t i = 0; i < num; i++)
	{
		v1.push_back(i);
	}

	for (int i = 0; i < num; i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	for (int i = 0; i < num; i++)
	{
		cout << v1.at(i) << " ";
	}
	cout << endl;

	cout << "首元素:" << v1.front() << endl;
	cout << "尾元素:" << v1.back() << endl;
}

1.7  :vector互换容器 

功能描述:实现两个容器内元素进行互换 ,并实现内存收缩

函数原型: swap(vector)  // 将vector元素 与本身的元素互换。

void test4() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < num; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	for (int i = num; i >0; i--)
	{
		v2.push_back(i);
	}
	printVector(v2);

	v1.swap(v2);
	printVector(v1);
	printVector(v2);
}

通过swap  实现内存收缩  

// swap实现内存收缩
void test5() {
	vector<int> v;
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
	}
	cout << "v 的容量为:" << v.capacity() << endl;
	cout << "v 的大小为:" << v.size() << endl;

	v.resize(3); // 收缩大小为3
	cout << "v 的容量为:" << v.capacity() << endl;
	cout << "v的大小为:" << v.size() << endl;

	// 下面的代码完成两件事
	// 1:创建一个 和 v 的size相同的 vector 匿名对象
	// 2: 将这个匿名对象和 v 互换(实际就是类型与将两个指针互换)
	// 最后,v的 大小和容量就都是 3 , 而匿名对象大小 为3 ,容量为12138
	// 待这行代码执行完毕,匿名随想被释放,所以就大道了收缩内存的 目的
	vector<int>(v).swap(v);
	cout << "v的容量为:" << v.capacity() << endl;
	cout << "v的 大小为:" << v.size() << endl;
}

 

1.8 :vector预留空间 

功能描述:减少vector 在动态扩展容量时的扩展次数 

函数原型 :reserve(int len) //容器预留 len 个元素长度,预留位置不初始化,元素不可访问。

案例:通过预留空间  和不预留空间 ,测试在存放大量数据时 vector的扩容次数。

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

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

相关文章

Java 集合学习笔记:HashMap - 迭代器

Java 集合学习笔记&#xff1a;HashMap - 迭代器iteratorsHashIteratorhasNextnextNoderemoveKeyIteratorValueIteratorEntryIteratorspliteratorsHashMapSpliteratorgetFence 获取拆分器的右边界estimateSize 估计剩余元素的个数KeySpliterator1. trySplit 尝试拆分2. forEach…

AQS学习

1.1 AQS 简单介绍 AQS 的全称为&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff0c;这个类在 java.util.concurrent.locks 包下面。 AQS 是一个用来构建锁和同步器的框架&#xff0c;使用 AQS 能简单且高效地构造出应用广泛的大量的同步器&#xff0c; 比如我们提…

多协议标签交换MPLS(计算机网络-网络层)

目录 MPLS 的优势 MPLS 首部的位置与格式 MPLS 首部的位置与格式 MPLS 转发等价类 MPLS 的优势 MPLS 的真正优点在于它的流量管理能力&#xff1a;提供沿多条路径转发分组的能力&#xff0c;并能灵活地为某些流量指定其中的一条路径 这种能力被称为显示路由&#xff0c;其…

占道经营出店摆摊监测识别 python

占道经营出店摆摊监测识别通过python基于yolov7网络架构深度学习模型&#xff0c;对现场画面中检测到出店摆摊违规经营或者流动商贩占道经营时&#xff0c;立即抓拍告警同步后台。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV…

【Django】第四课 基于Django超市订单管理系统开发

概念 本文在上一文之上&#xff0c;针对管理员&#xff0c;经理&#xff0c;普通员工身份的用户操作订单管理模块功能。 功能实现 该功能也是业务功能模块&#xff0c;管理员不具备操作权限&#xff0c;普通员工需要对超市所合作的供应商进行进货&#xff0c;因此普通员工可…

数据结构与算法——Java实现排序算法(二)

数据结构与算法——Java实现排序算法&#xff08;一&#xff09;_我爱布朗熊的博客-CSDN博客 七、希尔排序&#xff08;自我感觉有点难理解&#xff09; 为了解决直接插入排序所带来的弊端&#xff0c;我们接来下看一下希尔排序 希尔排序也是一种插入排序&#xff0c;简单插入排…

口罩佩戴监测系统 yolo

口罩佩戴监测系统通过yolo网络对现场画面人员口罩佩戴情况进行识别检测。我们使用YOLO(你只看一次)算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN)&#xff0c;用于实时进行目标检测。该算法将单个神经网络应用于完整的图像&#xff0c;然后将图像划分为多个区域&#x…

科技交流英语(2022秋)Unit 5 test

科技交流英语&#xff08;2022秋&#xff09;Unit 5 test 简介 由电子科技大学组织开设&#xff0c;授课教师为李京南、庞慧、刘兆林等5位老师。 课程介绍 英语广泛用于工程技术领域的国际交流。如何使用简洁的语言清楚地传递信息是工程师在国际舞台上常常面临的问题。本课…

ARM S5PV210 串行通信编程实战

一、串行通信编程实战1 1、整个程序流程分析 (1) 整个串口通信相关程序包含 2 部分&#xff1a;uart_init 负责初始化串口&#xff0c;uart_putc 负责发送一个字节。 2、串口控制器初始化关键步骤 (1) 初始化串口的 Tx 和 Rx 引脚所对应的GPIO&#xff08;查原理图可知 Rx 和…

【数列分段DP】膜拜

P1564 膜拜 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意&#xff1a; 思路&#xff1a; 这是个经典模型&#xff1a;数列分段DP&#xff0c;在其他地方也出现过&#xff1a;(150条消息) 代码源每日一题div1 DP 数组划分_lamentropetion的博客-CSDN博客 这类DP模型核…

_13LeetCode代码随想录算法训练营第十三天-C++二叉树

_13LeetCode代码随想录算法训练营第十三天-C二叉树 题目列表 102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点指针II…

说话人识别中的数据预处理和数据增强

数据预处理 假设已经采集到一些数据&#xff0c;在进行训练之前&#xff0c;需要先对数据做以下预处理&#xff1a; 数据清洗语音检测&#xff08;Voice Activity Detection&#xff0c;VAD&#xff0c;也叫Speech Detection&#xff0c;或Silence Suppression&#xff0c;静音…

ICMP V6(计算机网络-网络层)

IPv6 使用的 ICMP IETF 制定的与IPv6配套使用的ICMP新版本&#xff0c;即ICMPv6 ICMPv6报文作为IPv6分组有效载荷进行传输&#xff0c;对应的IPv6“下一个首部字段”的值为58 ICMPv6 的报文格式和 IPv4 使用的 ICMP 的相似&#xff0c;即前 4 个字节的字段名称都是一样的&…

Linux下进程及其相关概念理解

目录 何为进程&#xff1f; task_struct 中存储了什么进程信息&#xff1f; 如何查看进程&#xff1f; 如何获取进程pid&#xff1f; 如何创建子进程&#xff1f; 为什么返回值如此呢&#xff1f; 为什么有两个返回值&#xff1f; 进程状态 进程的一般状态 运行态 终…

18-JavaSE基础巩固练习:正则表达式练习

正则表达式基本练习 一、练习1 1、需求 请编写正则表达式验证用户输入的手机号码是否满足要求。请编写正则表达式验证用户输入的邮箱号是否满足要求。请编写正则表达式验证用户输入的电话号码是否满足要求。 2、思路&#xff1a; 心得&#xff1a; 拿着一个正确的数据&…

SAP UI5 Smart Chart 功能介绍

笔者已经写过一篇详细的文章介绍 SAP UI5 Smart Chart 的使用方法&#xff1a; SAP UI5 应用开发教程之一百五十三 - 使用 SAP UI5 Smart Chart 控件轻松绘制十数种不同类型的专业图表 本文泛泛地介绍 Smart Chart 提供的一些其他功能。 工具栏右侧的按钮可用于选择图表类型…

Zookeeper 1 初识 Zookeeper 1.1 Zookeeper 概念

Zookeeper 【黑马程序员Zookeeper视频教程&#xff0c;快速入门zookeeper技术】 文章目录Zookeeper1 初识 Zookeeper1.1 Zookeeper 概念1.1.1 Zookeeper 概念1 初识 Zookeeper 1.1 Zookeeper 概念 1.1.1 Zookeeper 概念 Zookeeper 是 Apache Hadoop 项目下的一个子项目&…

3、前端笔记-JS-变量

1、什么是变量 变量是用于存放数据的容器&#xff0c;可以通过变量名获取数据 本质&#xff1a;变量是程序在内存中申请的一块用来存放数据的空间 2、变量的使用 2.1 声明变量和赋值 1、声明变量 2、给变量赋值 var:JS关键字&#xff0c;用来声明变量。使用这个关键字后&a…

(二)计算机组成原理——计算机的基本组成

目录 冯诺依曼计算机的特点 计算机硬件框图 系统复杂性管理的方法&#xff08;3’Y&#xff09; 计算机的工作步骤 上机前的准备 计算机的工作过程 存储器的基本组成 运算器的基本组成及操作过程 控制器 计算机组成原理课程笔记。 冯诺依曼计算机的特点 冯诺依曼计算…

sandbox启动未加载repeater的问题

背景 通过官方提供的 repeater 的下载链接&#xff0c;并不能够在sandbox启动时&#xff0c;加载进行&#xff0c;我们可以看下sandbox的日志截图 但是如果通过源码的repeater进行安装后&#xff0c;就能够成功加载到repeater。 分析 这是个很奇怪的问题&#xff0c;想要分析…