c 中 為什麼陣列不能被vector完全替代

時間 2021-05-11 22:28:20

1樓:hiJack

1.陣列的記憶體是是靜態,vector的記憶體是動態,可能發生拷貝變動。

2.陣列效率高,vector效率相對低,因為vector實質上是在陣列的基礎上實現的。

3.陣列可以與C相容,vector不可以

除此之外沒有區別,vector更方便

2樓:陳禮

原因很多,舉個例子,部分驅動程式是用c++寫的。

在非使用者模式下,使用得是最簡單的結構。

至於為啥不用c寫,Linux沒這煩惱Windows驅動用wdk。

其它通訊協議的,也不會用直接用vector。

見多了就明白。

3樓:粉蒸排骨

c++中為什麼陣列不能被vector完全替代?

int arrayX[2];

std::vector vectorY ;

int* pX = & arrayX[1];

// pX在arrayX的作用域內始終有效int* pY = & vectorY[1];

// pY在vectorY新增元素後可能會失效!!!

auto itr = vectorY.begin();

// itr在vectorY新增元素後可能會失效!!!

原因是當你向vector內新加元素時,如果它發現自己空間不夠了,會重新分配乙個更大的空間,然後把原有資料全部複製過去,再釋放掉舊buffer。然後,你之前獲取的不論是指標還是迭代子,都失效了。

這權且算乙個vector不能替代陣列的小點吧。

4樓:xchg

vector內部使用了動態記憶體分配,而區域性變數的C陣列在棧上分配。分配速度差距很大,棧上分配只需要把棧頂指標暫存器改變即可。不過c++11之後有std::

array可以替代C陣列。

有些情況也需要使用vector的,比如要開闢乙個大陣列,這時候如果使用c陣列或者std::array有可能棧就爆了。

5樓:Sinaean Dean

個人感覺還是效率問題。我實實在在的用vector替代過c陣列,最後又改回來了。

比較明顯的問題乙個是分配的記憶體大小不可控,有時浪費記憶體明顯。另乙個問題是速度,new乙個vector會自動清零,也就是額外多了乙個memset,有時可能不是memset,而是for loop。

6樓:肖堂-數蠶

vector是動態分配的,/*pop或erase釋放重新分配會造成部分場景下的效能下降,千萬不要做出這種實現,否則可能在特殊條件下效能急劇下降,c++標準中要求相關實現不進行完整的記憶體重新分配*/

pop或erase未釋放則會造成的記憶體的浪費,所以使用時必須小心。可能需要手動的過程,此時和對陣列操作類似,因此無法替代陣列。

另外vector是動態記憶體分配的,對於相當多的場合下並不需要改變陣列大小,這時顯然直接使用陣列更方便,效能也更好。

7樓:d41d8c

因為vector醜。

vector> v(3, vector(3));

// 對比

int v[3][3];

8樓:Hocker

看應用,每種資料結構都有它的優勢。如果說vector陣列的優勢是可變,那比vector靈活的資料結構也很多,比如說各種樹結構。但vector也有他的優勢,實現和使用簡單。

所以應用場景決定你用什麼資料結構而不是那樣萬金油就用誰。

如果是初學者建議一步一步來,慢慢體會和掌握每種結構的優勢,為以後專案開發打下基礎。

為什麼c 中陣列不能直接拷貝給另一陣列?

d41d8c 結構體的拷貝建構函式中,陣列可以拷貝。lambda的拷貝捕獲可以捕獲陣列 int a 2 a structured binding也可以產生陣列的拷貝 int a 2 auto x,y a 中,x和y繫結到a的副本中的元素。甚至char a asdf 這種初始化也可以看作陣列拷貝的特例...

玩lol中單為什麼總是不能c?

Yyyyyyyyyjs 卡牌加里奧不是用來給你c的,是用來幫隊友c的發條沙皇如果不是實力碾壓,是需要別人幫你創造條件,你才能c的,要隊友幫你拖過發育期 然而現實是全圖流沒地飛,三線炸,或者幫了不拿資源白幫,發育流誰都來你中路吃線,你敢去別路補發育隊友就敢4打5 中單想c雙排工具人打野拿順手的一路殺穿...

為什麼C 的陣列必須要指明尺寸大小

作為小白,剛才解決了乙個bug。程式編譯沒問題,但是一執行就Segmentation fault core dumped 後來查資料,發現在對陣列賦值前,要先初始化其大小,比如 double a 50 或者在後面用,a.resize 50 來確定大小。小白回答,請輕噴。 編譯可執行檔案時,區域性變數...