C++中的不規(guī)則二維數(shù)組實(shí)現(xiàn)代碼
技術(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)文章希望大家以后多多支持腳本之家!
- C++?使用?new?創(chuàng)建二維數(shù)組實(shí)例
- c++利用vector創(chuàng)建二維數(shù)組的幾種方法總結(jié)
- C++二維數(shù)組螺旋加密信息
- C++二維數(shù)組中數(shù)組元素存儲(chǔ)地址的計(jì)算疑問(wèn)講解
- C++ 二維數(shù)組參數(shù)傳遞的實(shí)現(xiàn)方法
- C++二維數(shù)組中的查找算法示例
- C++中指針指向二維數(shù)組實(shí)例詳解
- C++中用new創(chuàng)建二維數(shù)組和指針數(shù)組實(shí)例代碼
- 詳解C++中的一維數(shù)組和二維數(shù)組
- C++指針數(shù)組、數(shù)組指針、數(shù)組名及二維數(shù)組技巧匯總
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之時(shí)間空間復(fù)雜度入門(mén)
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之時(shí)間空間復(fù)雜度的入門(mén)教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02VC++獲得當(dāng)前進(jìn)程運(yùn)行目錄的方法
這篇文章主要介紹了VC++獲得當(dāng)前進(jìn)程運(yùn)行目錄的方法,可通過(guò)系統(tǒng)函數(shù)實(shí)現(xiàn)該功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10Visual Studio 2022無(wú)法打開(kāi)源文件的解決方式
這篇文章主要介紹了Visual Studio 2022無(wú)法打開(kāi)源文件的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01C語(yǔ)言對(duì)堆排序一個(gè)算法思路和實(shí)現(xiàn)代碼
這篇文章主要介紹了C語(yǔ)言對(duì)堆排序一個(gè)算法思路和實(shí)現(xiàn)代碼,堆排序是一種樹(shù)形選擇排序,是對(duì)直接選擇排序的有效改進(jìn),需要的朋友可以參考下2014-06-06詳解C語(yǔ)言動(dòng)態(tài)內(nèi)存的分配
這篇文章主要為大家介紹了C語(yǔ)言動(dòng)態(tài)內(nèi)存的分配,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-12-12聊聊C++中右值引用和移動(dòng)構(gòu)造函數(shù)的使用
這篇文章主要是來(lái)和大家一起聊聊C++中右值引用和移動(dòng)構(gòu)造函數(shù)的使用,文中通過(guò)示例進(jìn)行了詳細(xì)講解,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-07-07C語(yǔ)言創(chuàng)建數(shù)組實(shí)現(xiàn)函數(shù)init,empty,reverse
這篇文章主要介紹了C語(yǔ)言創(chuàng)建數(shù)組實(shí)現(xiàn)函數(shù)init,empty,reverse,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07