二維vector可以轉二維陣列使用嗎?

2021-10-12 06:06:37 字數 2997 閱讀 9801

由於vector過載了下標運算子,且vector所儲存的資料是連續儲存,因此我們可以將vector引數直接當作一維陣列來使用,但二維vector能否直接轉換成二維陣列來使用呢?

不可以。

using std:

:vector;

template

t *vector2array

(vector v)

再來看看vector的記憶體占用:

void

sizeofvector()

// result:

// ==1==

// sizeof(vv): 12 12

// sizeof(v): 12 12

// ==2==

// sizeof(vv) = 12 12

// sizeof(v) = 12 12

可見,雖然vector也具有和陣列「通過下標隨機訪問」一樣的特性,但vector是通過過載運算子""來實現的,訪問記憶體的方式和陣列本質上並不相同。

vector和陣列的訪問方式區別如下:

vector直接當作一維陣列使用時,實際上「&v[0]」取的是data_ptr指向的記憶體區的首位址,而非vector本身的首位址。

int

**a[5]

[5];

int*ptr =

&a[0][

0]; vector<

int> v;

vector< vector<

int>

> vv;

v.push_back(1

); v.

push_back(1

); v.

push_back(1

); v.

push_back(1

);vv.

push_back

(v);vv.

push_back

(v);vv.

push_back

(v);vv.

push_back

(v);

cout<<

"&vv[0] = "

<

:hex<<

&vv[0]

<

//0xeb0e18

cout<<

"&vv[0][0] = "

<

:hex<<

&vv[0]

[0]<

//0xeb0dc8

cout<<

"&aa[0] = "

<

:hex<<

&aa[0]

<

//0x63fe58

cout<<

"&aa[0][0] = "

<

:hex<<

&aa[0]

[0]<

//0x63fe58

這是因為,二維vector的資料儲存區(連續空間)儲存的是成員vector,而&vv[0]則是「所有成員vector連續儲存的空間」的首位址。通過「vv[x]」可以隨機訪問到某個成員vector,而成員vector又可以進一步通過"「運算子訪問成員vector的資料區域,因此二維vector同樣可以通過」"的方式來訪問資料,這一點與二維陣列相同。只不過,二維vector儲存的資料並非連續。

1、二維陣列所有成員連續儲存在某個記憶體,二維vector不是;

2、兩者都可以通過""訪問資料,但二維陣列每行列數必須相同,且作形參傳遞時必須宣告每行的列數;

3、二維陣列可以降維訪問,二維vector不支援;

/*二維陣列的連續儲存*/

cout<

:hex<<

"&aa[1][3] "

<<

&aa[1]

[3]<<

" &aa[2][0] "

<<

&aa[2]

[0]<

// &aa[1][3] 0x63fe70 &aa[2][0] 0x63fe74

/*二維vector的非連續儲存*/

cout<

:hex<<

"&vv[1][3] "

<<

&vv[1]

[3]<<

" &vv[2][0] "

<<

&vv[2]

[0]<

// &vv[1][3] 0x9b0e0c &vv[2][0] 0x9b0d90

/*二維陣列的降維訪問*/

ptr =

&aa[0]

[0];

for(

intr(0

); r <

4; r++

)for

(intw(

0); w <

4; w++

)// &aa[1][1] 0x63fe60 &ptr[1*4 + 1] 0x63fe60

// &aa[3][2] 0x63fe84 &ptr[3*4 + 2] 0x63fe84

/*二維vector的降維訪問*/

ptr =

&vv[0]

[0];

for(

intr(0

); r <

4; r++

)for

(intw(

0); w <

4; w++

)// &vv[1][1] 0xf60e04 &ptr[1*4 + 1] 0xf60ddc

// &vv[3][2] 0xf60de8 &ptr[3*4 + 2] 0xf60e00

二維vector訪問機制如圖:

vector 二維陣列

1052 賣個萌 20分 萌萌噠表情符號通常由 手 眼 口 三個主要部分組成。簡單起見,我們假設乙個表情符號是按下列格式輸出的 左手 左眼 口 右眼 右手 現給出可選用的符號集合,請你按使用者的要求輸出表情。輸入首先在前三行順序對應給出手 眼 口的可選符號集。每個符號括在一對方括號內。題目保證每個集...

vector 二維陣列

int p p newint m 注意,int m 表示乙個有m個元素的指標陣列 p new int 8 表示分配乙個int空間並初始化為8 外層 vector int a 內層 a.push back 1 a.push back 2 a.push back 3 vector int b b.pus...

vector 陣列 二維陣列

c 中可以通過容器來建陣列,二維陣列 include stdafx.h include include using namespace std int main array.resize 2 二維陣列預設m行 array 1 resize 4 array 1 resize n 二維陣列第2行預設n個...