学习笔记(4月17日)vector底层原理

1.vector<vector>底层原理

vector是表示可变大小数组的序列容器,相当于一个动态的数组,比数组优越的在于它具有可动态改变的大小,同时,它写成了类模板,说明可以适用于其他类型,包括vector本身,它的底层原理是这样实现的:

在vector里创建vector数组,相当于vector里存的是每一个vector数组的头指针,就像二维数组一样,

以顺序表为例,描述顺序表的结构体里有数组的头指针,元素个数、数组容量,那vector<vector>的结构体里就有指向第一个vector的头指针、元素个数、数组容量,而第一个vector里就有数组的头指针,元素个数、数组容量,类似于一种层层嵌套的感觉。

但实际上,标准的vector是由三个迭代器实现的,并非我们上面描述的那样。

例题:杨辉三角

题目链接

在C语言里可以用二维数组进行实现,但C++方式又该如何做呢?

用我们上面说的vector<vector>就行了。

这里的核心问题是:如何去分配空间?像C语言那样静态数组的一口气开完会浪费,开少又不够,vector里的resize可以完美的解决这个问题。

如上图的三角形,第一行有一个,第二行有两个,以此类推,所以,对每一个vector,我们含顺序进行resize,在这里reserve也可以起到开空间的作用,但resize还可以进行初始化,节省很多不必要的操作。

开辟空间完成后,根据杨辉三角的定义,每个数是它左上方和右上方的数的和,进行计算即可。

cpp 复制代码
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> vv(numRows);
        for(int i=0;i<numRows;i++)
        {
            vv[i].resize(i+1,1);
        }
        for(int i=2;i<numRows;i++)
        {
            for(int j=1;j<i;j++)
            {
                vv[i][j]=vv[i-1][j-1]+vv[i-1][j];
            }
        }
        return vv;
    }
};
相关推荐
nice_lcj520几秒前
排序(2)-选择排序专题——简单选择排序与堆排序的结构优化
数据结构·算法·排序算法
nice_lcj5202 分钟前
排序(4)-归并排序专题——归并排序的分治美学
java·数据结构·算法·排序算法
AI_零食4 分钟前
HarmonyOS ArkTS 数据格式化技术深度解析
学习·华为·harmonyos·鸿蒙
暗夜猎手-大魔王8 分钟前
hermes源码学习7--会话存储
人工智能·学习
上海观智网络13 分钟前
健身房瑜伽馆想开发小程序,上海靠谱服务商怎么选?
经验分享·笔记
leo_yu_yty13 分钟前
Go语言分布式计算(并发Debug)
开发语言·笔记·后端·golang
洛水水17 分钟前
【力扣100题】83.最小栈
算法·leetcode·职场和发展
Dovis(誓平步青云)17 分钟前
《QT学习第五篇:QSS美化界面与API绘图》
开发语言·数据库·qt·学习·时序数据库·开源智能体
nice_lcj52026 分钟前
排序(3)-第三篇:交换排序专题——从冒泡排序到快速排序的效率飞跃
java·数据结构·算法·排序算法
San813_LDD26 分钟前
[深度学习]量化研究_ML_Lesson2
笔记