10 vector的使用

文档介绍

文档介绍

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

vector的使用

一定要学会查看文档,是非常重要的

定义

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

InputIterator是可以单向迭代器.是一个模板,可以传任意类型的迭代器,用string的迭代器也没问题

iterator的使用

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

在这里插入图片描述

int main()
{
	//初始化
	//vector()
	//vector(size_type n, const value_type& val = value_type())
	//vector (InputIterator first, InputIterator last); 

	vector<int> v1;
	vector<int> v2(3, 5);
	vector<int> v3(v2.begin(), v2.end());
	string s1("hello");
	vector<char> v4(s1.begin(), s1.end());

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

	/*vector<int>::reverse_iterator rit = v1.rbegin();
	while (rit != v1.rend())
	{
		cout << *rit << endl;
		rit++;
	}*/
	cout << v2.max_size();
	for (auto ch : v4)
	{
		cout << ch << " ";
	}
	return 0;
}

空间增长

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

capacity的代码在vs和g++下分别运行会发现,vs下capacity是1.5被增长的,g++是2倍增长的,vs的版本是PJ,g++是SGI版本
reserve只负责开辟空间,如果确定知道需要多少空间,reserve可以缓解vector增容的代价缺陷问题
resize在开辟空间的同时还会初始化,影响size

void test1()
{
	vector<int> v1;

	size_t size = v1.capacity();
	cout << size << endl;
	for (size_t i = 0; i < 100; i++)
	{
		v1.push_back('4');
		if (size != v1.capacity())
		{
			cout << v1.capacity() << endl;
			size = v1.capacity();
		}
	}
}

在这里插入图片描述

在这里插入图片描述

// 如果已经确定vector中要存储元素大概个数,可以提前将空间设置足够
// 就可以避免边插入边扩容导致效率低下的问题了
void TestVectorExpandOP()
{
 vector<int> v;
 size_t sz = v.capacity();
 v.reserve(100); // 提前将容量设置好,可以避免一遍插入一遍扩容
 cout << "making bar 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';
 }
 }
}

增删改查

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

vector的插入删除必须使用迭代器做参数,不提供下标的删除,为了和其他容器保持一致

void test2()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);

	//insert需要迭代器参数
	vector<int>::iterator pos = find(v1.begin(), v1.end(), 2);
	v1.insert(pos,5);
	for (auto ch : v1)
	{
		cout << ch << " ";
	}
	vector<int>::iterator pos1 = find(v1.begin(), v1.end(), 2);
	v1.erase(pos1);
	for (auto ch : v1)
	{
		cout << ch << " ";
	}
}

注意,迭代器不能重复使用,会报错,涉及迭代器失效

迭代器失效

在vecotr实现中详细分析

题目

杨辉三角
在这里插入图片描述

思路:
c语言中用二维数组来解决这个问题,c++可以用vector,每个vector就是一个数组,所以需要二维vector。题目要求返回row行,那么二维vector设置大小为row个vector,每个vecotr设置成row个元素,初始化为0,第一行和最后一行设置为1.不是1的位置等于上一行前一个元素和上一个当前元素相加

class Solution {
public:
    vector<vector<int>> generate(int numRows) {

        vector<vector<int>> v;
        v.resize(numRows, vector<int>());
        for(int i = 0; i < v.size() ; i ++)
        {
            v[i].resize(i + 1 , 0);
            v[i][0] = v[i].back() = 1;
            for(int j = 0; j < v[i].size() ; j++)
            {
                if (v[i][j] == 0)
                {
                    v[i][j] = v[i-1][j-1] + v[i-1][j];
                }
            }
        }

        return v;
    }
};

电话号码的字母组合
在这里插入图片描述

思路:
先用一个全局字符串数组记录每个按键对应的字符串。创建递归的函数,根据下标从0开始取出输入的第一个数字的字符串,从第一个字符串开始循环增加下标深度遍历,不断添加输入的数字的每个字符串。如果超过输入的数字说明可以加入返回的vector数组。整体结构是个多叉树

如,输入23,2是“abc”,3是“def”,先假如ad,再假如ae,af,bd,be,bf…
在这里插入图片描述

class Solution {
public:
    string numstr[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    void Combinations(const string& digits,size_t di,string comstr,vector<string>& strv)
    {
        if (di == digits.size())
        {
            strv.push_back(comstr);
            return;
        }

        int num = digits[di] - '0'; 
        string str = numstr[num];

        for(auto ch:str)
        {
            Combinations(digits, di + 1,comstr + ch,strv);
        }

    }

    vector<string> letterCombinations(string digits) {
        vector<string> strv;
        if (digits.size() == 0)
        {
            return strv;
        }
        Combinations(digits,0 ,"",strv);
        return strv;
    }
};

递归展开图
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Web】浅聊Java反序列化之C3P0——URLClassLoader利用

目录 前言 C3P0介绍 回归本源——序列化的条件 利用链 利用链分析 入口——PoolBackedDataSourceBase#readObject 拨云见日——PoolBackedDataSourceBase#writeObject 综合分析 EXP 前言 这条链最让我眼前一亮的就是对Serializable接口的有无进行了一个玩&#xff0c…

权限管理系统-0.2.0

三、菜单管理接口 3.1 创建SysMenu类及相关类 首先创建sys_menu表&#xff1a; CREATE TABLE sys_menu (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 编号,parent_id bigint(20) NOT NULL DEFAULT 0 COMMENT 所属上级,name varchar(20) NOT NULL DEFAULT COMMENT 名称,…

【脚本玩漆黑的魅影】寂雨镇全自动练级

文章目录 原理全部代码 原理 老样子。 治疗路径&#xff0c;练级路径。 def zhi_liao(): # 去治疗walk(RIGHT)walk(RIGHT)press(UP, 0.4)for i in [1, 2, 3, 4]:press(A)for i in [1, 2, 3, 4]:press(B)press(DOWN, 0.4)press(LEFT) def chu_qu(): # 右逛c.press(B)press(…

力扣同类题:重排链表

很明显做过一次 class Solution { public:void reorderList(ListNode* head) {if(!head||!head->next)return;ListNode *fasthead,*lowhead;ListNode *prenullptr,*curnullptr,*nextnullptr;while(fast->next!nullptr){fastfast->next;if(fast->next)fastfast->…

风控规则决策树可视化(升级版)

上一篇我们介绍了如何通过交叉表来生成规则&#xff0c;本篇我们来介绍一种可以生成多规则的方法&#xff0c;决策树。除了做模型以外&#xff0c;也可以用来挖掘规则&#xff0c;原理是一样的。 下面通过sklearn的决策树方法来实现风控规则的发现&#xff0c;同时分享一种可以…

【联邦学习综述:概念、技术】

出自——联邦学习综述&#xff1a;概念、技术、应用与挑战。梁天恺 1*&#xff0c;曾 碧 2&#xff0c;陈 光 1 从两个方面保护隐私数据 硬件层面 可 信 执 行 环 境 &#xff08;Trusted Execution Environment&#xff0c;TEE&#xff09;边 缘 计 算&#xff08;Edge Com…

电动车窗开关中MOS管的应用解析

随着科技的不断发展&#xff0c;电动车窗系统已经成为现代汽车中不可或缺的一部分。而MOS&#xff08;金属氧化物半导体&#xff09;管的应用&#xff0c;为电动车窗开关注入了新的活力&#xff0c;极大地提高了其使用寿命和安全性。 一、MOS的优越性能 MOS管以其卓越的开关…

磁盘无法访问?别慌,这里有解决之道!

电脑中&#xff0c;那块储存着重要文件与数据的磁盘&#xff0c;突然之间无法访问&#xff0c;是不是让你感到惊慌失措&#xff1f;面对这样的突发状况&#xff0c;很多人可能会感到手足无措。但别担心&#xff0c;本文将为你解析磁盘无法访问的原因&#xff0c;并提供实用的数…

小文件问题及GlusterFS的瓶颈

01海量小文件存储的挑战 为了解决海量小文件的存储问题&#xff0c;必须采用分布式存储&#xff0c;目前分布式存储主要采用两种架构&#xff1a;集中式元数据管理架构和去中心化架构。 (1)集中式元数据架构&#xff1a; 典型的集中式元数据架构的分布式存储有GFS&#xff0…

代码讲解:如何把3D数据转换成旋转的视频?

目录 3D数据集下载 读取binvox文件 使用matplotlib创建图 动画效果 完整代码 3D数据集下载 这里以shapenet数据集为例&#xff0c;可以访问外网的可以去直接申请下载&#xff1b;我也准备了一个备份在百度网盘的数据集&#xff0c;可以参考&#xff1a; ShapeNet简介和下…

Leetcode 54. 螺旋矩阵

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff1a; 输入&a…

Linux文件系列: 深入理解缓冲区和C标准库的简单模拟实现

Linux文件系列: 深入理解缓冲区和C标准库的简易模拟实现 一.缓冲区的概念和作用二.一个样例三.理解样例1.样例解释2.什么是刷新? 四.简易模拟实现C标准库1.我们要实现的大致框架2.mylib.h的实现1.文件结构体的定义2.myfopen等等函数的声明3.完整mylib.h代码 3.myfopen函数的实…

备战蓝桥杯Day25 - 二叉搜索树

一、基本概念 二叉搜索树&#xff08;Binary Search Tree&#xff09;&#xff0c;又称为二叉查找树或二叉排序树&#xff0c;是一种具有特定性质的二叉树。 定义&#xff1a;二叉搜索树可以是一棵空树&#xff0c;也可以是具有以下特性的非空二叉树&#xff1a; 若其左子树不…

MAC OS 14.2.1 ASP.NET Core 调试遇到的端口占用的问题

一、问题描述 在调试 ASP.NET Core 项目时&#xff0c;遇到一个很奇怪的问题&#xff0c;不管项目是否已经运行&#xff0c;使用 Postman 测试接口时&#xff0c;都返回 403 Forbidden。重启电脑&#xff0c;刚开始还好好的&#xff0c;过一会儿就返回 403 Forbidden。 二、问…

AOP切面编程,以及自定义注解实现切面

AOP切面编程 通知类型表达式重用表达式切面优先级使用注解开发&#xff0c;加上注解实现某些功能 简介 动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理&#xff0c;没有接口时只能使用cglib动态代理JDK动态代理动态生成的代理类…

2024蓝桥杯每日一题(双指针)

一、第一题&#xff1a;牛的学术圈 解题思路&#xff1a;双指针贪心 仔细思考可以知道&#xff0c;写一篇综述最多在原来的H指数的基础上1&#xff0c;所以基本方法可以是先求出原始的H指数&#xff0c;然后分类讨论怎么样提升H指数。 【Python程序代码】 n,l map(int,…

一篇文章搞定数字电桥

大家好&#xff0c;我是砖一。 最近做项目过程中&#xff0c;有一个应届生问我怎么测电容和电感&#xff0c;我推荐他使用数字电桥&#xff08;也叫LCR表&#xff09;&#xff0c;他不会用&#xff0c;今天我写了一篇文章供小白们参考一下&#xff0c;包学会~ 一&#xff0c;…

WebRTC简介及实战应用 — 从0到1实现实时音视频聊天等功能

一、WebRTC简介 WebRTC 是由一家名为 Gobal IP Solutions,简称 GIPS 的瑞典公司开发的。Google 在 2011 年收购了 GIPS,并将其源代码开源。然后又与 IETF 和 W3C 的相关标准机构合作,以确保行业达成共识。其中: Web Real-Time Communications (WEBRTC) W3C 组织:定义浏览…

【npm】node包管理工具npm的介绍和基础使用

简言 npm 是 Node.js 的 包管理器&#xff08;Package Manager&#xff09;&#xff0c;它是专门用于管理 Node.js 项目中第三方库的工具。 本文介绍下npm和其使用方法。 npm介绍 npm 是世界上最大的软件注册中心。各大洲的开源开发者都使用 npm 共享和借用软件包&#xff…

开源组件安全风险及应对

在软件开发的过程中&#xff0c;为了提升开发效率、软件质量和稳定性&#xff0c;并降低开发成本&#xff0c;使用开源组件是开发人员的不二选择&#xff08;实际上&#xff0c;所有软件开发技术的演进都是为了能够更短时间、更低成本地构建软件&#xff09;。这里的开源组件指…