学习笔记(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;
    }
};
相关推荐
HyperAI超神经41 分钟前
IQuest-Coder-V1:基于代码流训练的编程逻辑增强模型;Human Face Emotions:基于多标注维度的人脸情绪识别数据集
人工智能·深度学习·学习·机器学习·ai编程
testpassportcn1 小时前
UiPath-ADPV1 認證介紹|Automation Developer Professional v1
网络·学习·改行学it
玄冥剑尊1 小时前
贪心算法进阶
算法·贪心算法
生擒小朵拉1 小时前
ROS1学习笔记(二)
笔记·学习
玄冥剑尊1 小时前
贪心算法深化 I
算法·贪心算法
52Hz1181 小时前
力扣73.矩阵置零、54.螺旋矩阵、48.旋转图像
python·算法·leetcode·矩阵
BHXDML1 小时前
第一章:线性回归& 逻辑回归
算法·逻辑回归·线性回归
iAkuya2 小时前
(leetcode)力扣100 二叉搜索树种第K小的元素(中序遍历||记录子树的节点数)
算法·leetcode·职场和发展
Root_Hacker2 小时前
include文件包含个人笔记及c底层调试
android·linux·服务器·c语言·笔记·安全·php
Remember_9933 小时前
【LeetCode精选算法】滑动窗口专题二
java·开发语言·数据结构·算法·leetcode