由於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個...