最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中的不規(guī)則二維數(shù)組實(shí)現(xiàn)代碼

 更新時(shí)間:2024年03月07日 09:31:06   作者:DECHIN  
本文介紹了一個(gè)在C++中保存不定長(zhǎng)二維數(shù)組的數(shù)據(jù)結(jié)構(gòu),在這個(gè)結(jié)構(gòu)中,我們使用了一個(gè)含有指針和數(shù)組長(zhǎng)度的結(jié)構(gòu)體,用這樣的一個(gè)結(jié)構(gòu)體構(gòu)造一個(gè)結(jié)構(gòu)體數(shù)組,用于存儲(chǔ)每一個(gè)不定長(zhǎng)的數(shù)組,感興趣的朋友一起看看吧

技術(shù)背景

最近剛學(xué)習(xí)C++的一些編程技巧,對(duì)于一些相對(duì)比較陌生的問(wèn)題,只能采取一些簡(jiǎn)單粗暴的方案來(lái)實(shí)現(xiàn)。就比如說(shuō),我們可以在Python中定義一個(gè)[[0,0,0],[1,2],[1,1,1],[3]]這樣的不規(guī)則的二維數(shù)組(list)。那么如果我們想在C++中實(shí)現(xiàn)一個(gè)類(lèi)似的數(shù)據(jù)結(jié)構(gòu),應(yīng)該怎么去設(shè)計(jì)呢?更具體一點(diǎn)的問(wèn)題,當(dāng)我們給C++輸入一個(gè)固定長(zhǎng)度的數(shù)組,比如Shape為(4,3),然后再給出一個(gè)Shape為(4,)的有效索引數(shù)組,保存的是第二個(gè)維度中數(shù)據(jù)的有效長(zhǎng)度(這里有個(gè)要求是輸入的有效位數(shù)處于固定長(zhǎng)度數(shù)組的末尾,因?yàn)槲覀円话闳ジ聰?shù)組時(shí)也是從末尾處push_back進(jìn)去)。最后用一個(gè)數(shù)據(jù)結(jié)構(gòu)保存這個(gè)不規(guī)則的二維數(shù)組,并且可以正常索引和打印。

數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

首先我們能夠想到的是,用雙重指針來(lái)對(duì)這樣的一個(gè)不規(guī)則數(shù)組進(jìn)行索引,第一個(gè)指針指向第一個(gè)維度,第二個(gè)指針指向第二個(gè)維度,就類(lèi)似于張量中的兩條邊。由于第二個(gè)維度是不定長(zhǎng)度的,因此我們需要使用一個(gè)結(jié)構(gòu)體來(lái)包含一個(gè)不定長(zhǎng)數(shù)組的指針,和具體的長(zhǎng)度信息。

struct bucket{
    int num;
    int *ptr;
};

就比如這個(gè)bucket實(shí)現(xiàn),對(duì)于單個(gè)bucket來(lái)說(shuō),可以用其中的*ptr指針來(lái)索引一個(gè)不定長(zhǎng)度的數(shù)組,然后在外層定義一個(gè)*bucket指針,這樣可以索引到對(duì)應(yīng)的結(jié)構(gòu)體中,形成一個(gè)二維的不定長(zhǎng)度的數(shù)據(jù)結(jié)構(gòu)。

代碼實(shí)現(xiàn)

這里我們使用的案例是這樣的,首先要構(gòu)造一個(gè)定長(zhǎng)的數(shù)組,然后對(duì)這個(gè)定長(zhǎng)的數(shù)組的第二個(gè)維度進(jìn)行分別的截?cái)啵儋x值給我們定義好的數(shù)據(jù)結(jié)構(gòu)。這樣做的好處是,在Python跟C++的接口中也能夠使用這種方法來(lái)實(shí)現(xiàn),我們只需要傳給C++一個(gè)定長(zhǎng)的數(shù)組,以及第二個(gè)維度的有效長(zhǎng)度,就能在C++中使用這樣一個(gè)不定長(zhǎng)的數(shù)組進(jìn)行高效的計(jì)算。詳細(xì)代碼如下所示:

// 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(){
    // 定長(zhǎng)數(shù)組
    int arr[4][3] = {{0,1,2},{1,2,3},{2,3,4},{3,4,5}};
    // 有效長(zhǎng)度
    int shape[4] = {2,3,2,1};
    // 先構(gòu)建結(jié)構(gòu)體數(shù)組
	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];
    }
    // 再把結(jié)構(gòu)體數(shù)組賦值給結(jié)構(gòu)體指針
    bucket *bc = _bc;
    // 打印結(jié)構(gòu)體的所有內(nèi)容
    print_bucket(bc, shape);
    return 0;
}

輸出結(jié)果為:

$ g++ main.cpp -o main && ./main
2: 1,2,
3: 1,2,3,
2: 3,4,
1: 5,

這里第一列輸出的是每一個(gè)不定長(zhǎng)數(shù)組的長(zhǎng)度,后面的是不定長(zhǎng)數(shù)組的具體內(nèi)容。

總結(jié)概要

本文介紹了一個(gè)在C++中保存不定長(zhǎng)二維數(shù)組的數(shù)據(jù)結(jié)構(gòu)。在這個(gè)結(jié)構(gòu)中,我們使用了一個(gè)含有指針和數(shù)組長(zhǎng)度的結(jié)構(gòu)體,用這樣的一個(gè)結(jié)構(gòu)體構(gòu)造一個(gè)結(jié)構(gòu)體數(shù)組,用于存儲(chǔ)每一個(gè)不定長(zhǎng)的數(shù)組。最后可以將這個(gè)不定長(zhǎng)數(shù)組的內(nèi)存地址賦值給一個(gè)結(jié)構(gòu)體指針,那么這個(gè)結(jié)構(gòu)體指針中就包含了所有不定長(zhǎng)數(shù)組所需的內(nèi)容。類(lèi)似的使用場(chǎng)景,更多的出現(xiàn)在Python和C++兩個(gè)不同的語(yǔ)言進(jìn)行交互的時(shí)候,這樣操作可以兼具Python的易開(kāi)發(fā)特性和C++的高性能特性。

版權(quán)聲明

本文首發(fā)鏈接為:https://www.cnblogs.com/dechinphy/p/struct.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

請(qǐng)博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

到此這篇關(guān)于C++中的不規(guī)則二維數(shù)組實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)C++二維數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言類(lèi)的基本語(yǔ)法詳解

    C語(yǔ)言類(lèi)的基本語(yǔ)法詳解

    大家好,本篇文章主要講的是C語(yǔ)言類(lèi)的基本語(yǔ)法詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C語(yǔ)言進(jìn)階之內(nèi)存操作函數(shù)詳解

    C語(yǔ)言進(jìn)階之內(nèi)存操作函數(shù)詳解

    這篇文章主要為大家學(xué)習(xí)介紹了C語(yǔ)言中內(nèi)存操作函數(shù)(memcpy、memmove和memcmp)的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-07-07
  • C++實(shí)現(xiàn)LeetCode(38.計(jì)數(shù)和讀法)

    C++實(shí)現(xiàn)LeetCode(38.計(jì)數(shù)和讀法)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(38.計(jì)數(shù)和讀法),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 使用Qt的QChartView實(shí)現(xiàn)縮放和放大功能

    使用Qt的QChartView實(shí)現(xiàn)縮放和放大功能

    QCustomPlot是一個(gè)小型的Qt畫(huà)圖標(biāo)類(lèi),支持繪制靜態(tài)曲線、動(dòng)態(tài)曲線、多重坐標(biāo)曲線,柱狀圖,蠟燭圖,這篇文章主要介紹了Qt的QChartView實(shí)現(xiàn)縮放和放大功能,需要的朋友可以參考下
    2022-09-09
  • C++棧的數(shù)組實(shí)現(xiàn)代碼

    C++棧的數(shù)組實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++棧的數(shù)組實(shí)現(xiàn)方式,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 使用C++實(shí)現(xiàn)簡(jiǎn)單的文章生成器

    使用C++實(shí)現(xiàn)簡(jiǎn)單的文章生成器

    這篇文章主要為大家詳細(xì)介紹了鵝湖使用C++實(shí)現(xiàn)簡(jiǎn)單的狗屁不通文章生成器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下
    2024-03-03
  • C++重載運(yùn)算符的規(guī)則詳解

    C++重載運(yùn)算符的規(guī)則詳解

    運(yùn)算符重載函數(shù)可以是類(lèi)的成員函數(shù),也可以是類(lèi)的友元函數(shù),還可以是既非類(lèi)的成員函數(shù)也不是友元函數(shù)的普通函數(shù)
    2013-10-10
  • 深度解析C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)

    深度解析C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)

    本文詳細(xì)介紹了C語(yǔ)言中數(shù)據(jù)的存儲(chǔ),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C++ Boost Graph算法超詳細(xì)精講

    C++ Boost Graph算法超詳細(xì)精講

    這篇文章主要介紹了C++ Boost Graph算法,我門(mén)嘗試使用Boost.Graph庫(kù)來(lái)運(yùn)行Goldberg的最大流算法。 Boost.Graph將其稱(chēng)為push_relabel_max_flow
    2022-10-10
  • 解析linux 文件和目錄操作的相關(guān)函數(shù)

    解析linux 文件和目錄操作的相關(guān)函數(shù)

    以下是對(duì)linux中文件和目錄操作的相關(guān)函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08

最新評(píng)論

伊宁市| 拜城县| 石渠县| 东丰县| 益阳市| 自治县| 西和县| 奉贤区| 米泉市| 桑日县| 龙井市| 临汾市| 庄浪县| 彭泽县| 平原县| 阿拉善左旗| 三原县| 北安市| 古浪县| 汉川市| 马边| 拉萨市| 巴塘县| 沙洋县| 竹北市| 涿州市| 福泉市| 普兰店市| 江达县| 凤翔县| 大关县| 晋州市| 正蓝旗| 米易县| 贵州省| 商丘市| 罗甸县| 陵川县| 行唐县| 洱源县| 宣城市|