C++中的不规则二维数组
技术背景
最近刚学习C++的一些编程技巧,对于一些相对比较陌生的问题,只能采取一些简单粗暴的方案来实现。就比如说,我们可以在Python中定义一个[[0,0,0],[1,2],[1,1,1],[3]]这样的不规则的二维数组(list)。那么如果我们想在C++中实现一个类似的数据结构,应该怎么去设计呢?更具体一点的问题,当我们给C++输入一个固定长度的数组,比如Shape为(4,3),然后再给出一个Shape为(4,)的有效索引数组,保存的是第二个维度中数据的有效长度(这里有个要求是输入的有效位数处于固定长度数组的末尾,因为我们一般去更新数组时也是从末尾处push_back进去)。最后用一个数据结构保存这个不规则的二维数组,并且可以正常索引和打印。
数据结构设计
首先我们能够想到的是,用双重指针来对这样的一个不规则数组进行索引,第一个指针指向第一个维度,第二个指针指向第二个维度,就类似于张量中的两条边。由于第二个维度是不定长度的,因此我们需要使用一个结构体来包含一个不定长数组的指针,和具体的长度信息。
struct bucket{
int num;
int *ptr;
};
就比如这个bucket实现,对于单个bucket来说,可以用其中的*ptr指针来索引一个不定长度的数组,然后在外层定义一个*bucket指针,这样可以索引到对应的结构体中,形成一个二维的不定长度的数据结构。
代码实现
这里我们使用的案例是这样的,首先要构造一个定长的数组,然后对这个定长的数组的第二个维度进行分别的截断,再赋值给我们定义好的数据结构。这样做的好处是,在Python跟C++的接口中也能够使用这种方法来实现,我们只需要传给C++一个定长的数组,以及第二个维度的有效长度,就能在C++中使用这样一个不定长的数组进行高效的计算。详细代码如下所示:
// g++ main.cpp -o main && ./main
#include <iostream>
struct bucket{
int num;
int *ptr;
};
void print_bucket(bucket *bc, int shape[]){
for (int i=0; i<4; i++){
bucket bc_i = bc[i];
printf("%d: ", bc_i.num);
for (int j=0; j<shape[i]; j++){
printf("%d,", bc_i.ptr[j]);
}
printf("\n");
}
}
int main(){
// 定长数组
int arr[4][3] = {{0,1,2},{1,2,3},{2,3,4},{3,4,5}};
// 有效长度
int shape[4] = {2,3,2,1};
// 先构建结构体数组
bucket _bc[4];
for (int i=0; i<4; i++){
_bc[i].num = shape[i];
_bc[i].ptr = arr[i];
_bc[i].ptr += 3-shape[i];
}
// 再把结构体数组赋值给结构体指针
bucket *bc = _bc;
// 打印结构体的所有内容
print_bucket(bc, shape);
return 0;
}
输出结果为:
$ g++ main.cpp -o main && ./main
2: 1,2,
3: 1,2,3,
2: 3,4,
1: 5,
这里第一列输出的是每一个不定长数组的长度,后面的是不定长数组的具体内容。
总结概要
本文介绍了一个在C++中保存不定长二维数组的数据结构。在这个结构中,我们使用了一个含有指针和数组长度的结构体,用这样的一个结构体构造一个结构体数组,用于存储每一个不定长的数组。最后可以将这个不定长数组的内存地址赋值给一个结构体指针,那么这个结构体指针中就包含了所有不定长数组所需的内容。类似的使用场景,更多的出现在Python和C++两个不同的语言进行交互的时候,这样操作可以兼具Python的易开发特性和C++的高性能特性。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/struct.html
作者ID:DechinPhy
更多原著文章:https://www.cnblogs.com/dechinphy/
请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
C++中的不规则二维数组的更多相关文章
- C语言中如何将二维数组作为函数的参数传递
今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...
- php中向前台js中传送一个二维数组
在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...
- 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组
学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...
- <转载>c++中new一个二维数组
原文连接 在c++中定义一个二维数组时有多种方式,下面是几种定义方式的说明:其中dataType 表示数据类型,如int byte long... 1.dataType (*num)[n] = n ...
- C++中动态申请二维数组并释放方法
C/C++中动态开辟一维.二维数组是非常常用的,以前没记住,做题时怎么也想不起来,现在好好整理一下. C++中有三种方法来动态申请多维数组 (1)C中的malloc/free (2)C++中的new/ ...
- 如何在C++中动态建立二维数组(转)
http://blog.sina.com.cn/s/blog_7c073a8d0100qp1w.html http://blog.163.com/wujiaxing009@126/blog/stati ...
- 消除VS中动态申请二维数组C6011,C6385,C6386的警告
动态申请二维数组,无非就是通过指针来实现.@wowpH 过程分三步:1.申请内存,2.使用数组,3.释放内存. 代码如下: /************************************* ...
- C++中vecotr表示二维数组并自己实现一个Grid类
1 C++中使用vector来表示二维数组 声明一个二维数组: vector<vector<int>> dp(row, vector<int>(col)); 将变量 ...
- OpenCV中Mat与二维数组之间的转换
---恢复内容开始--- 在OpenCV中将Mat(二维)与二维数组相对应,即将Mat中的每个像素值赋给一个二维数组. 全部代码如下: #include <iostream> #inclu ...
- PHP中如何对二维数组按某个键值进行排序
$arr=[ array( 'name'=>'张三', 'age'=>28 ), array( 'name'=> ...
随机推荐
- CLion搭建Qt开发环境,并解决目录重构问题(最新版)
序言 Qt版本不断更新,QtCreator也不断更新.在Qt4和Qt5时代,我一直认为开发Qt最好的IDE就是自带的QtCreator,可是时至今日,到了Qt6时代,QtCreator已经都12.0. ...
- PicoPixel贴图查看器
Pico Pixel Pico Pixel是一款纹理查看器,支持查看以下文件格式:TGA,BMP,JPG,DDS,PNG,OpenEXR, KTX, HDR, GIF, TIF. 此外,Pico Pi ...
- vim 从嫌弃到依赖(8)——使用命令模式编辑文本
通过前面的文章,我们已经介绍了vim的普通模式.插入模式.可视模式.接下来让我们接着介绍vim中另一个强大的模式--命令行模式 命令模式简介 命令模式可以说在vim中的使用频率不亚于普通模式,像我们平 ...
- SpringBoot中优雅地实现统一响应对象
目录 前言 实现步骤 定义统一响应对象类 定义一个忽略响应封装的注解 实现ResponseBodyAdvice接口 定义Controller类 总结 前言 近日心血来潮想做一个开源项目,目标是做一款可 ...
- SpringBoot 多模块开发 笔记(一)
多模块开发 简易版 dao 层 也可以说是 Mapper 层 web 层 将 controller 放在这一层 还有 统一返回类型 和 自定义异常 也在放在这里 启动类也放在这里 model 层 也就 ...
- Linux-ln命令创建链接(软连接/硬链接)
1.ln命令介绍 ln命令可以看作是 link 的缩写,其功能是创建文件间的链接,链接类型包括硬链接(hard link)和软链接(符号链接,symbolic link) 2.ln命令格式 ln 命令 ...
- Hive中Lateral view用法
1. lateral view 简介 hive函数 lateral view 主要功能是将原本汇总在一条(行)的数据拆分成多条(行)成虚拟表,再与原表进行笛卡尔积,从而得到明细表.配合UDTF函数 ...
- NC19832 1408
题目链接 题目 题目描述 小m曾经给小t和小s讲过一个奇怪的故事.这个故事叫做1408.故事的大体内容如下. 主人公迈克·安瑟林(约翰·库萨克饰)是一个恐怖小说家.将装神弄鬼作为本职工作的迈克,平日里 ...
- Shell 特殊符号(变量)用法小结
Shell | 特殊变量 $n 基本语法: $n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}) 例如: ...
- SATA 学习笔记——Frame/Primitive解析
一.故事前传 我们之前说到Link layer的结构,link layer的作用大致可以包括以下几点: Frame flow control CRC的生成与检测(已解析,详细见历史文章) 对数据与控制 ...