欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

技術(shù)背景

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

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

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

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

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

代碼實現(xiàn)

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

// 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(){
    // 定長數(shù)組
    int arr[4][3] = {{0,1,2},{1,2,3},{2,3,4},{3,4,5}};
    // 有效長度
    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,

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

總結(jié)概要

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

版權(quán)聲明

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

作者ID:DechinPhy

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

請博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

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

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之時間空間復(fù)雜度入門

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之時間空間復(fù)雜度入門

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)與算法之時間空間復(fù)雜度的入門教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • VC++獲得當前進程運行目錄的方法

    VC++獲得當前進程運行目錄的方法

    這篇文章主要介紹了VC++獲得當前進程運行目錄的方法,可通過系統(tǒng)函數(shù)實現(xiàn)該功能,是非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • Visual Studio 2022無法打開源文件的解決方式

    Visual Studio 2022無法打開源文件的解決方式

    這篇文章主要介紹了Visual Studio 2022無法打開源文件的解決方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C語言對堆排序一個算法思路和實現(xiàn)代碼

    C語言對堆排序一個算法思路和實現(xiàn)代碼

    這篇文章主要介紹了C語言對堆排序一個算法思路和實現(xiàn)代碼,堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進,需要的朋友可以參考下
    2014-06-06
  • C語言如何輸出中文

    C語言如何輸出中文

    這篇文章主要介紹了C語言如何輸出中文問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解C語言動態(tài)內(nèi)存的分配

    詳解C語言動態(tài)內(nèi)存的分配

    這篇文章主要為大家介紹了C語言動態(tài)內(nèi)存的分配,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • windows下如何安裝OpenCL

    windows下如何安裝OpenCL

    這篇文章主要介紹了windows下如何安裝OpenCL,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • C++中static修飾符的詳解及其作用介紹

    C++中static修飾符的詳解及其作用介紹

    這篇文章主要介紹了C++中static修飾符的詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 聊聊C++中右值引用和移動構(gòu)造函數(shù)的使用

    聊聊C++中右值引用和移動構(gòu)造函數(shù)的使用

    這篇文章主要是來和大家一起聊聊C++中右值引用和移動構(gòu)造函數(shù)的使用,文中通過示例進行了詳細講解,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-07-07
  • C語言創(chuàng)建數(shù)組實現(xiàn)函數(shù)init,empty,reverse

    C語言創(chuàng)建數(shù)組實現(xiàn)函數(shù)init,empty,reverse

    這篇文章主要介紹了C語言創(chuàng)建數(shù)組實現(xiàn)函數(shù)init,empty,reverse,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07

最新評論