学习笔记(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;
    }
};
相关推荐
执着25910 分钟前
力扣hot100 - 199、二叉树的右视图
数据结构·算法·leetcode
I_LPL13 分钟前
day21 代码随想录算法训练营 二叉树专题8
算法·二叉树·递归
可编程芯片开发20 分钟前
基于PSO粒子群优化PI控制器的无刷直流电机最优控制系统simulink建模与仿真
人工智能·算法·simulink·pso·pi控制器·pso-pi
cpp_250121 分钟前
P8448 [LSOT-1] 暴龙的土豆
数据结构·c++·算法·题解·洛谷
lcj251121 分钟前
深入理解指针(4):qsort 函数 & 通过冒泡排序实现
c语言·数据结构·算法
fie888923 分钟前
基于MATLAB的转子动力学建模与仿真实现(含碰摩、不平衡激励)
开发语言·算法·matlab
魔力军26 分钟前
Rust学习Day3: 3个小demo实现
java·学习·rust
唐梓航-求职中30 分钟前
编程大师-技术-算法-leetcode-1472. 设计浏览器历史记录
算法·leetcode
_OP_CHEN33 分钟前
【算法基础篇】(五十八)线性代数之高斯消元法从原理到实战:手撕模板 + 洛谷真题全解
线性代数·算法·蓝桥杯·c/c++·线性方程组·acm/icpc·高斯消元法
唐梓航-求职中41 分钟前
编程大师-技术-算法-leetcode-355. 设计推特
算法·leetcode·面试