C++的二维vector和C的二维数组学习

C++的二维数组 在 C++ 中,二维数组是一种常用的数据结构,它可以看作是数组的数组,类似于数学中的矩阵。以下将从定义、初始化、访问元素、内存布局和使用示例等方面详细介绍 C++ 中的二维数组。二维数组的一般定义语法如下:数据类型 数组名[行数][列数];其中,数据类型 可以是任意有效的 C++ 数据类型,如 int、double、char 等;数组名是用户为数组取的名称;行数 和 列数 分别表示数组的行数和列数,它们必须是常量表达式。示例:// 定义一个3行4列的二维整数数组。 阅读详情

C++的二维vector和C的二维数组学习

参考了http://blog.youkuaiyun.com/zhuqinglu/article/details/1805050

可通过下列代码直接创建m*n的二维vector
vector<vector <int> > ivec(m ,vector<int>(n));    //m*n的二维vector

动态创建m*n的二维vector
方法一:
vector<vector <int> > ivec;
ivec.resize(m);
for(int i=0;i<m;i++) ivec[i].resize(n);

方法二:
vector<vector <int> > ivec;
ivec.resize(m,vector<int>(n));

动态创建二维数组a[m][n]
C语言版:

创建代码:

#include<malloc.h>
int **a=(int **)malloc(m*sizeof(int *));
for(int i=0;i<m;i++)
a[i]=(int *)malloc(n*sizeof(int));

释放代码:

for (i=0;i<m;i++)
{
     free(data[i]);
}              
free(data);


C++版:
创建代码:

int **a=new int*[m];
for(int i=0;i<m;i++) a[i]=new int[n];

释放代码:

for(int i = 0; i != m; i++)
{
    delete[] p[i];
}
delete[] p;

初始化二维数组:

int a[2][2] = {{1,2},
                  {3,4}};

初始化二维vector:

如果全初始化为0:

vector<vector <int> > ivec(m ,vector<int>(n,0));    //m*n的二维vector,所有元素为0

也可以用

        vector<vector<int>> A;
        A.resize(m, vector<int>(n, 0));

注意:上例中n固定。但二维vector的第二维的size()并不一定要是常数,如下例中的三个vector组成的二维vector,其大小分别为1,2,3。这一点跟C的二维数组不一样。

vector<vector<int> > vecSet;
for(int i = 1; i <= 3; i++)
    vecSet.push_back(vector<int>(i,0));

如果初始化为不同值:

vector<vector<int> > a {{1,2}, {3,4}};

注意与上面的C的二维数组区别,这里a的后面加不加'='号都可以。

如果C++的class里面定义了vector,可以在class的constructor里面初始化,比如:

class Myclass {
public: 
    Myclass(int m_size): v1(my_size,0), v2(m_size, 0){}
    ...
private:
    vector<int> v1, v2; 
}

如果想遍历二维vector(按vector一个一个来),可以用C++ 11的auto,比如

#include <iostream>
#include <vector>

using namespace std;

int main() {

  vector<vector<int> > v = {{1,2}, {3,4}};
  for (const auto& inner : v) {
      for (const auto& item : inner) {
          cout << item << " ";
      }
  }
  cout << endl;

  return 0;
}

定义一个二维数组,第一维有26个,但第二维不定。

 vector<vector<int>> vecs(26, vector<int>());

三维vector怎么定义呢? 一个例子如下

 vector<vector<vector<bool> > > dp (n, vector<vector<bool> >(n, vector<bool>(n + 1, false)));

另一个三维vector的初始化例子:
vector<vector<vector<int>>> dp(len + 1, vector<vector<int>>(k + 1, vector<int>(target + 1, 0)));

二维vector的初始化如下:
假设已经有vector<vector<bool>> board;
vector<vector<bool> > mask(board.size(), vector<bool>(board[0].size(), true));
 

下面是一些关于C/C++ 二维数组初始化的资料,引用自
C语言二维数组的定义、初始化、赋值

二维数组的初始化(赋值)

二维数组的初始化可以按行分段赋值,也可按行连续赋值。

例如,对于数组 a[5][3],按行分段赋值应该写作:

int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };

按行连续赋值应该写作:

int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};

这两种赋初值的结果是完全相同的。
对于二维数组的初始化还要注意以下几点:

1) 可以只对部分元素赋值,未赋值的元素自动取“零”值。例如:

int a[3][3] = {{1}, {2}, {3}};

是对每一行的第一列元素赋值,未赋值的元素的值为 0。赋值后各元素的值为:
1  0  0
2  0  0
3  0  0

再如:

int a[3][3] = {{0,1}, {0,0,2}, {3}};

赋值后各元素的值为:
0  1  0
0  0  2
3  0  0

2) 如果对全部元素赋值,那么第一维的长度可以不给出。例如:

int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

可以写为:

int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

3) 二维数组可以看作是由一维数组嵌套而成的;如果一个数组的每个元素又是一个数组,那么它就是二维数组。当然,前提是各个元素的类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组,C语言允许这种分解。

例如,二维数组a[3][4]可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]。

这三个一维数组可以直接拿来使用。这三个一维数组都有 4 个元素,比如,一维数组 a[0] 的元素为 a[0][0]、a[0][1]、a[0][2]、a[0][3]。

如果要返回一个二维空vector,可以用return vector<vector<int>>();
好像也可以用return {{}};

下面内容参考链接:https://blog.youkuaiyun.com/shizheng_Li/article/details/105862560
圆括号
vector<int> v(n):圆括号是构造函数,表示1个容量为n的vector
方括号
vector<int> v[n] :表示n个vector v ,二维数组
相当于 vector<vector<int > > v(n);二维数组

举例
vector v(10) 表示 一个容量=10的vector
vector v[10] 表示10个容量不确定的vector组成的二维数组
//////////////////

二维数组斜向遍历
 

假设二维数组的大小 \(n = 4\),当 \(l\) 从 2 递增到 4 时,遍历的区间 \([i, j]\) 顺序如下:

  • \(l = 2\)(长度为 2 的斜线,即紧邻主对角线的上方):
    • \(i = 0 \rightarrow [0, 1]\)
    • \(i = 1 \rightarrow [1, 2]\)
    • \(i = 2 \rightarrow [2, 3]\)
  • \(l = 3\)(长度为 3 的斜线):
    • \(i = 0 \rightarrow [0, 2]\)
    • \(i = 1 \rightarrow [1, 3]\)
  • \(l = 4\)(长度为 4 的斜线):
    • \(i = 0 \rightarrow [0, 3]\)

    每次外层循环 \(l\) 增加时,实际上是在遍历平行于主对角线的右上方的另一条斜线 。

    // 斜着遍历数组
    for (let l = 2; l <= n; l++) {
        for (let i = 0; i <= n - l; i++) {
            let j = l + i - 1;
            // 计算 dp[i][j]
        }
    }

    2024年最新【C++】详解vector二维数组的全部操作(超细图例解析,2024年最新一名毕业三年的女程序媛面试头条经验 的强大是众所周知滴,早晚都是要解决滴,因此专门写下这篇文章,以供自己复习和各位老铁使用,快速的回忆vector的用法,让你找回自信,不用再竞赛的时候颜面尽失。所以针对问题二出现的原因:vector 直接根据下标访问必须要先push,存在数才行。中,创建一维数组或者更高维度的数组时,都是需要提前给他分配大小的。观察规律,可以得出如下的初始化格式:容器(大小,内容)(2)下面定义的是行为r,列为c的二维数组,初始值为0。(1)下面定义的是行为r,列为c的二维数组。中我们并不需要那么做,我们可以直接。 阅读详情

    相关推荐

    Vector创建二维数组

    然而,在选择使用vector创建二维数组时,也需要考虑到其可能带来的性能开销,并根据具体的应用场景进行权衡。创建一个vector,其元素类型为另一个vector,即vector<vector<T>>,其中T是数组中元素的类型(如int、double等)。添加行或列:通过push_back方法可以在二维数组的末尾添加新的行,而要在已有行中添加列,则需要对特定的内部vector使用push_back。删除行或列:使用erase方法可以从二维数组中删除特定的行,而删除列则需要从对应的内部vector中删除元素。

    chengede98的博客 3266

    vector创建数组(一维、二维)的超详细总结

    今天刷leetcode的时候,发现vector都还没用明白,但是STL早晚要解决明白,因此作者专门写下这篇文章,以供自己复习等使用,快速回忆其vector的用法,不再丢人

    小黑同学的博客 2万+

    动态二维数组类(C++ Vector)

    C++、vector、类实现二维动态数组,运算符重载,矩阵相加、矩阵相乘

    weixin_54186646的博客 1万+

    【C++】详解vector二维数组的全部操作(超细图例解析!!!)

    最近在刷 Leetcode 的时候,发现 vector 的二维数组操作 都还没弄明白吗,但是STL的强大是众所周知滴,早晚都是要解决滴,因此专门写下这篇文章,以供自己复习和各位老铁使用,快速的回忆vector的用法,让你找回自信,不用再竞赛的时候颜面尽失。

    weixin_45031801的博客 7万+

    C++ vector二维数组按照任意列排序

    1.sort()函数,默认的是对二维数组按照第一列的大小对每行的数组进行排序。默认从小到大 #include <iostream> #include<vector> #include<algorithm> using namespace std; int main() { vector<vector<int> > intervals(10); for (int i = 0; i < 10; i++) { for (int j

    qq_38748148的博客 3290

    c++ study notes[2]

    C++数组与容器使用指南 本文介绍了C++中数组的两种实现方式:C风格的静态数组和C++风格的std::array。示例展示了两种数组的初始化方法以及如何通过范围循环遍历元素。同时还介绍了更灵活的std::vector容器

    逻辑君的日常 353

    C++ 动态创建二维数组

    背景知识: 对二维数组的理解方式至关重要:把二维数组看成是一种特殊的一维数组,它的元素又是一个一维数组。 例如:int a[3][4], 可以理解为定义了3个一维数组,即相当于 a[0], a[1], a[2], 而它们的每个元素又是一个包含4个元素的一维数组,即: a[0]: a[0][0], a[0][1], a[0][2], a[0][3] a[1]: a[1][0], a[1][...

    菜鸟学编程 1万+

    给jetson nano 安装AX200网卡驱动

    几经波折,因为在网上看到的基本都是amd版本而非arm版,然后最终选定V5.5是因为更新的几个版本的arm版本是false的(在https://kernel.ubuntu.com/~kernel-ppa/mainline/处选择版本时,得看在arm64上是false还是build succeeded,之前没经验呀刚刚才顿悟的) 1,参考文章https://blog.youkuaiyun.com/MIRANA0/article/details/106696334 学到了得下载如下四个: wget https://k

    发嘎嘎的博客 2345

    C++中动态申请二维数组并释放方法

    C/C++中动态开辟一维、二维数组是非常常用的,以前没记住,做题时怎么也想不起来,现在好好整理一下。  C++中有三种方法来动态申请多维数组   (1)C中的malloc/free   (2)C++中的new/delete    (3)STL容器中的vector  下面逐一介绍: 第一种:malloc/free 1.动态开辟一维数组 //动态开辟一维数组 void dynamicC

    牟尼的专栏 5万+

    GPS定位不准?可能是GDOP在作怪!手把手教你优化卫星几何分布

    本文深入解析了GPS定位精度不佳的常见原因——几何精度因子GDOP。通过剖析卫星几何分布对定位误差的放大效应,文章提供了从理解GDOP、PDOP、HDOP等关键指标,到使用专业APP实时诊断卫星天空图,再到利用在线工具提前规划最佳定位时机的完整实战指南。旨在帮助户外爱好者、无人机飞手及专业用户主动优化卫星几何条件,从而显著提升定位可靠性。

    weixin_29062823的博客 305

    DICOM三维重建:基于VTK实现三种面绘制算法

    版本:VS2019、VTK9.0.1 #define vtkRenderingCore_AUTOINIT 3(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingOpenGL2) #define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL2) #include "vtkDICOMImageReader.h" #include "vtkRenderWindowInteractor.h" #i

    一直在笑的博客 5922

    C/C++ 一维,二维数组和二维vector初始化

    vector的初始化有很多方式,在N维初始化时还会一些容易出现错误的地方。下面进行总结 以下的总结均以int作为模板参数 1.一维vector的初始化 vector的构造函数通常来说有五种,如下: vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t vector(const vector&):复制构造函数 v

    qq_36458461的博客 2656

    汇川AM系列PLC玩转CNC:手把手教你用File模式读取G代码文件(附避坑指南)

    本文详细介绍了如何使用汇川AM系列PLC的File模式读取G代码文件,涵盖从CAD设计到PLC配置的全流程。特别针对路径格式、文件类型等常见问题提供避坑指南,帮助工程师快速实现CNC加工的自动化控制。

    weixin_33582311的博客 404

    【C++】STL容器实现二维数组

    目录导言01.一个问题02.用法一(我没用过,借鉴知识点)2.1二维vector的定义2.2 二维vector实例03.vector遍历方法3.1 下标遍历方法(常用)3.2 区间迭代(C++11新特性)04.Working遇到的二维vector例子05.总结06.结语 导言 数组,想必大家并不陌生,C语言中我们经常会定义各种数组,自然也包括二维数组。 所有数组都有一个特性,那就是我们在定义他们的时候必须限制他的大小,这是不能徇私的,大家都一样,必须遵守这个规则。 01.一个问题 如果在工作中要你用C

    Cain Xcy的博客 5059

    LLM大模型-vLLM本地部署全流程:Windows WSL2环境安装、HuggingFace与Modelscope模型加载与本地运行、Docker化部署与镜像分发

    vLLM本地部署大模型方案 vLLM是一款高性能大模型推理引擎,通过PagedAttention技术显著提升吞吐量和内存效率,支持低成本、高并发的本地部署。 核心优势: 性能卓越:吞吐量远超同类方案,支持连续批处理等高级功能 成本优化:减少GPU服务器需求 兼容性强:提供类OpenAI的简洁API 部署步骤: 硬件准备:需NVIDIA GPU(如A100/3090),显存≥模型参数量×2(7B模型需14GB) 软件环境: Linux系统或Windows WSL2 安装CUDA 12.1+和Python 3.

    2202_75674969的博客 4566

    智能制造——解读AI+工业设备预测性维护解决方案【附全文阅读】

    摘要:本方案面向设备密集型制造企业,提供基于AI的预测性维护解决方案。通过工业物联网、大数据和AI算法,整合传感器数据与专家知识库,构建异常检测、故障诊断等模型,实现设备台账管理、智能点检等核心功能。方案配套软硬件工具矩阵,已在锂电子等行业落地应用,可降低维护成本30%以上,减少非计划停机50%,助力企业智能化转型。

    cdfunlove的博客 138

    c语言vector用法 二维,c++用vector创建二维数组

    1 vector二维数组的创建和初始化std::vector vec(10,90); //将10个一维动态数组初始为90std::vector > vec(row,vector(col,0)); //初始化row * col二维动态数组,初始化值为02 获取一维数组的长度int size = vec.size();3 获取二维数组的长度int size_row = vec.size();...

    weixin_34094525的博客 2111

    支付域——“清算、结算、清结算”

    本文深入探讨了支付系统中的清算和结算流程,包括核心流程、模块设计及特殊场景处理。文章详细阐述了交易收单、资金冻结、清分规则、清算批处理、结算出账等关键步骤,并讨论了交易失败、数据不一致、退款、汇率波动等异常情况的处理方法。

    庄小焱 2558

    c语言二维vector大小,vector作为二维数组

    vector本来就是可以用来代替一维数组的,vector提供了operator[]函数,可以像数组一样的操作,而且还有边界检查,动态改变大小。这里只介绍用它来代替二维的数组,二维以上的可以依此类推。1、定义二维vectorvector > v;//注意>和>之间的空格。(c++11之后不用注意vector> 后面两个之间的空格了)2、访问二维vector的元素的三种方式如...

    weixin_36082987的博客 3372

    Transformer在BEV感知中的统治地位

    Transformer在BEV感知中的统治地位 ,人工智能,计算机视觉,大模型,AI,本文围绕 Transformer 在 BEV 感知中的统治地位展开,介绍了 Transformer 的基础原理,如自注意力、多头注意力机制等,以及 BEV 感知的概念、任务与挑战。阐述了 Transformer 在 BEV 感知中的技术优势,包括全局建模、灵活特征融合和长距离依赖捕捉能力,还介绍了典型架构、代码示例及在自动驾驶目标检测等领域的应用案例。同时,评估了其性能,提及优化方法,并展望了与其他技术融合、端到端系统等…

    不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 20万+

    大中型超市收银系统(可直接运行)

    光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

    C/C++创建二维数组的几种方法

    1. 确定维度定义 int rows=4; int cols=5; int n2Arr[rows][cols];//错误,矩阵维度必须为常数 int n2Arr[4][5]; //正确,定义了4*5的二维矩阵 /****二维矩阵初始化*****/ int n2Arr[][ ]={{1,2},{3,4}};//必须确定一维矩阵中维度,即列数 int n2Arr[][2]={{1,2},{3,4}};//正确,行数可以根据初始化确定 注意两点:   ①. 定义二维数组维度需要确定为长度;   ②.

    All_In_gzx_cc的博客 3322

    华为的C语言编程规范.pdf

    华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

    使用Vector实现二维数组

    <br />from:   XHeartBlue.home.chinaren.com <br /><br />用vector取代C-style的数组   <br />            提起数组,大家想必都很熟悉,你可以用索引和指针来操作数组,给程序设计带来了很大的灵活性。但是你知道它有许多天生的缺陷吗? <br />          首先,数组的越界可能会引起程序的崩溃(如果崩溃了,还算你走运^_^)。其次是动态性不好,包括动态改变大小,动态申请。诸如此类的事,一定会让你伤透脑筋。有什么办法可以解决

    zsuguangh的专栏 7万+

    数学建模模型总结

    这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

    Camera2Demo

    在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

    C/C++中动态申请二维数组

    C/C++中动态申请二维数组 C语言动态申请二维数组 在C语言中,数组的大小必须在编译期就作为一个常数确定下来。如果提前不知道数组的大小,那必须使用malloc函数来进行动态申请。 使用malloc/free函数来动态申请二维数组 示例代码如下: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int width = 3; int height = 3;

    SZU_黄其才 5254

    C++中创建二维数组

    c++中创建数组都需要给出一个明确的大小。而实际中经常需要用到动态大小的数组。 以下是创建二维数组的方法: int **p=new int*[x]; for(int i=0;i<x;i++) { p[i]=new int[y]; } //定义二维数组x行y列 for(int i=0;i<x;i++) for(int j=0;j<y;j++) { cin>>p[i][j]; } //二维数组的赋值

    weixin_42127177的博客 6601

    二维数组动态分配存储空间及二维vector的初始化

    二维数组动态分配存储空间 设二维数组为ans[numRows][numRows] ans = (int **)malloc( numRows*sizeof(int *) ); for ( i = 0; i < numRows; i++ ) ans[i] = (int *)malloc( numRows*sizeof(int) ); ...

    qq_44709990的博客 1807

    java vector 实现二维数组

    最后研究的结果:不用vector排序了,直接自定义结构体(在c++中是结构体struct,Java 中是自定义class),然后用数组(数组保存的类型是结构体),自定义比较类cmp,然后Arrays.sort(a,new cmp())。 https://mp.youkuaiyun.com/postedit/88592611 这个是我最终写的java实现二维数组排序,我觉得还是自己写得好理解,实用。 ...

    weixin_39450145的博客 4267
    上一篇: Leetcode-35: Search Insert Position
    下一篇: Leetcode-46: Permutations
    评论 1
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

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

    抵扣说明:

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

    余额充值