C++初阶—vector类

QT6实现USB摄像头接入显示与抓拍功能实现 QT实现USB摄像头接入显示 一、UVC协议简介 UVC全称是USB Video Class(USB视频类),是一种标准化的USB视频设备通信协议,它定义了摄像头与主机之间的数据传输协议和格式。 UVC协议的出现,解决了摄像头厂商之间互不兼容,以及摄像头应用开发与平台之间的散乱问题。 UVC标准是由USB-IF主导制定的,目前最新的版本是UVC 1.5,UVC的缺省设置类容易实现,不需要额外的驱动程序。 阅读详情

第一章:vector的介绍及使用

1.1 vector的介绍

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

使用STL的三个境界:能用,明理,能扩展 ,那么下面学习vector,我们也是按照这个方法去学习

1.2 vector的使用

vector学习时一定要学会查看文档:vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。

1.2.1 vector的定义

(constructor)构造函数声明 接口说明
vector()(重点) 无参构造
vector(size_type n, const value_type& val = value_type()) 构造并初始化n个val
vector (const vector& x); (重点) 拷贝构造
vector (InputIterator first, InputIterator last);  使用迭代器进行初始化构造

1.2.2 vector iterator 的使用

iterator的使用 接口说明
begin + end(重点) 获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator
rbegin + rend 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator

1.2.3 vector 空间增长问题

容量空间 接口说明
size  获取数据个数
capacity  获取容量大小
empty  判断是否为空
resize(重点) 改变vector的size
reserve (重点) 改变vector的capacity

1.2.4 vector 增删查改

vector增删查改 接口说明
push_back(重点) 尾插
pop_back (重点) 尾删
find 查找 查找。(注意这个是算法模块实现,不是vector的成员接口)
insert 在position之前插入val
erase 删除position位置的数据
swap 交换两个vector的数据空间
operator[] (重点) 像数组一样访问

vector的使用代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>


using namespace std;

void test_vector1() {
	vector<int> v1;//无参构造
	vector<int> v2(10, 1);//构造并初始化10个1

	vector<int> v3(v2.begin(), v2.end());//迭代器区间初始化

	//可以用其他容器迭代器初始化,因为这里构造函数是函数模版,但数据类型要匹配
	string str("hello world");
	vector<int> v4(str.begin(), str.end());//这里数据类型严格来说不匹配,但可以走隐式类型转换

	vector<int> v5(v4);//拷贝构造


	//遍历vector
	for (size_t i = 0; i < v3.size(); i++)
		cout << v3[i] << " ";
	cout << endl;

	//vector<int>::iterator it = v4.begin();
	auto it = v4.begin();
	while (it != v4.end()) {
		cout << *it << " ";
		++it;
	}
	cout << endl;

	for (auto e : v5)
		cout << e << " ";
	cout << endl;
}

void test_vector2() {
	// 测试vector的默认扩容机制
	size_t sz;
	vector<int> v;
	//v.reserve(100);//如果reserve100个空间就不会再扩容
	//v.resize(100);//还会继续扩容,因为size也到100了,下方代码插入的数据是从101位置开始
	sz = v.capacity();
	cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i) {
		v.push_back(i);
		if (sz != v.capacity()) {
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
	//vs:运行结果:vs下使用的STL基本是按照1.5倍方式扩容
	//making foo grow :
	//capacity changed : 1
	//capacity changed : 2
	//capacity changed : 3
	//capacity changed : 4
	//capacity changed : 6
	//capacity changed : 9
	//capacity changed : 13
	//capacity changed : 19
	//capacity changed : 28
	//capacity changed : 42
	//capacity changed : 63
	//capacity changed : 94
	//capacity changed : 141

	//g++运行结果:linux下使用的STL基本是按照2倍方式扩容
	//making foo grow :
	//capacity changed : 1
	//capacity changed : 2
	//capacity changed : 4
	//capacity changed : 8
	//capacity changed : 16
	//capacity changed : 32
	//capacity changed : 64
	//capacity changed : 128
}

void test_vector3() {
	vector<int> v1;
	cout << v1.max_size() << endl;//max_size没有实际意义

	
	vector<int> v;
	//v.reserve(100);//该方式开空间,capacity虽然是100,但size=0,不能使用下面的方式插入数据。
	v.resize(100);//size = 100  capacity = 100

	for (size_t i = 0; i < v.size(); i++) //size是0,所以没有进循环。
		v[i] = i; //将v.size()改为100也不可以,[]有断言,只能访问0~size-1
	
	for (auto e : v)
		cout << e << " ";
	cout << endl;
}

void test_vector4() {
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	for (auto e : v)
		cout << e << " "; // 1 2 3 4
	cout << endl;

	v.insert(v.begin(), 0);//头插0
	for (auto e : v)
		cout << e << " "; // 0 1 2 3 4
	cout << endl;

	//在3前面插入30
	//该find是算法库提供的,而不是vector提供。因为很多数据容器查找逻辑是相同的。
	//string自带find是因为除了找字符,还可能要找字符串
	auto it = find(v.begin(), v.end(), 3);//通过迭代器找3
	if (it != v.end())
		v.insert(it, 30);

	for (auto e : v)
		cout << e << " ";// 0 1 2 30 3 4
	cout << endl;

	//删除3
	it = find(v.begin(), v.end(), 3);
	if (it != v.end())
		v.erase(it);

	for (auto e : v)
		cout << e << " ";// 0 1 2 30 4
	cout << endl;

	//clear只清除数据
	cout << v.size() << endl;//5
	cout << v.capacity() << endl;//6
	v.clear();
	cout << v.size() << endl;//0
	cout << v.capacity() << endl;//6
	v.shrink_to_fit();//clear后再调用shrink就释放空间了
}

int main() {
	//test_vector1();
	//test_vector2();
	//test_vector3();
	test_vector4();

	return 0;
}

第二章:vector深度剖析及模拟实现

2.1 vector的模拟实现

Vector.h

#pragma once
#include <assert.h>
#include <string>

namespace bit {
	template <class T>
	class vector {
	public:
		typedef T* iterator;//typedef受到访问限定符限制,如果不在公有,后续无法使用迭代器的begin()和end()等
		typedef const T* const_iterator;

		iterator begin() { return _start; }
		iterator end() { return _finish; }
		const_iterator begin() const { return _start; }
		const_iterator end() const { return _finish; }

		//vector()
		//	:_start(nullptr), _finish(nullptr), _end_of_storage(nullptr) {}
		//优化版本 - 在成员变量声明处给缺省值
		vector() {} //这个构造函数虽然没内容,但必须保留,因为有了迭代器区间构造和拷贝构造编译器就不再生成默认构造函数

		//类模版里面还可以继续写模版函数。
		//下方示例中如果将InputIterator模版替换为iterator,那么vector迭代器区间初始化就只能用vector类型的迭代器
		//但实际上,有使用其他类型迭代器初始化的需求
		template <class InputIterator>         
		vector(InputIterator first, InputIterator last) { //这里已经在成员变量声明处给缺省值
			//错误,此时_finish还是空,解引用空报错
			//while (first != last)
			//	*_finish++ = *first++;
	
            while (first != last) {
				push_back(*first);
				++first;
			}
		}

		vector(size_t n, const T&am
Outlook Express 6 (OE6) for Win7/Win8/Win10 英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。 立即下载

相关推荐

【Cubietruck】Qt5.8.0 x64、x86、armhf三个版本的编译安装

一、       Preparation 以下环境配置支持虚拟机和实体机,但是实体机生产效率会相对高一点,实体机编译Qt的速度是虚拟机两倍以上。 若使用虚拟机,推荐使用VirtualBox,开源免费,尽量不要使用Vmware破解版。   Download List   名称 链接 下载项目 OS https://mirro

beatfan的博客 3658

Qt UI界面美化教程1:【“飞扬青云” Qt精美控件】使用教程1

相信很多小伙伴在使用Qt Widget的过程中都会遇到一个问题,开发出来的界面,丑!丑!丑!当然Qt做界面美化可以用到QSS,需要对前端知识有一定了解,后续本套教程将会做讲解。本篇文章,我们直接站在巨人(大佬飞扬青云)的肩膀上,使用他开发好的163款自定义控件,请大家一定支持他,去给他小心心,他的个人主页:本篇文章只讲述如何在 QtDesigner 安装这些控件。

2401_87556704的博客 1419

2026年数字IC设计禾赛科技笔试带答案解析

本文介绍了一份数字IC设计工程师笔试的试卷结构和部分题目解析。试卷包含15道单选题(30分)、10道填空题(20分)和5道简答/编程题(50分),总分100分,考试时长120分钟。单选题涉及同步时序电路、Verilog语法、跨时钟域设计、FPGA优化、存储器层次、功耗优化等知识点;填空题考查环形振荡器、工艺参数、时序约束、LUT结构等基础概念。试题重点考察应聘者对数字电路设计核心概念的理解和实际工程应用能力,特别是针对激光雷达芯片设计中的关键技术点进行考核。

Open 123

Autosar 下电过程-基于ETAS工具

本文介绍基于ETAS工具对应的BIP包的下电过程,仅供参考。在最后调用SBC下电时,需要理清楚SBC的休眠流程,否则可能会出现休眠又唤醒情况。后面有空会介绍9471的休眠流程。

赞的博客 810

人形机器人电源系统硬件开发:从原理图设计到PCB布局的完整流程

人形机器人是“移动的智能终端”,其电源系统如同“心脏+血管”:既要为大脑(主控)、肌肉(电机)、感官(传感器)提供稳定能量,又要在有限体积内应对高动态负载(如跳跃时电机瞬间大电流)。本文聚焦“硬件开发”维度,覆盖从需求分析到PCB制板的完整流程,适合硬件工程师、机器人爱好者快速掌握工程实战方法。

AI天才研究院 2174

《使用R包ggtree进行进化树的绘制与美化》

都2023年了,才去使用Y叔早在2018年发表的进化树构建利器——ggtree。刚好最近在做基因家族分析,进化树的构建与美化确实有点麻烦,先前使用MEGA11进行了绘制,但图像简陋,于是导出了nwk文件,准备使用其他软件进行美化。这里,我使用ggtree包进行操作。

沉香best的博客 6895

LLM 大模型学习必知必会系列(十一):大模型自动评估理论和实战以及大模型评估框架详解

LLM 大模型学习必知必会系列(十一):大模型自动评估理论和实战以及大模型评估框架详解

丨汀、的博客 3216

【GlobalMapper精品教程】094:GlobalMapper26简体中文版安装教程(附安装包下载)

【GlobalMapper精品教程】094:GlobalMapper26简体中文版安装教程(附安装包下载)- 基于深度学习的图像分析工具,用于自动识别土地覆盖分类、建筑物提取和车辆检测。新的太阳阴影分析工具,用于计算加载地形和 3D 要素的阴影。新的 GENERATE_SHADOWS 脚本命令允许自动执行这些计算。新增点云模型关键点自动识别。能够在自动点云分析工具中保存和加载自定义创建的要素模型。改进了像素到点中各种潜在重叠图像中 GCP 的自动识别。

智慧空间实验室 4889

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: C++初阶—string类
下一篇: C++初阶—list类
Awkwardx
博客等级 码龄5年 341粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值