STL vector與陣列的互轉

2021-07-25 19:51:14 字數 1978 閱讀 7833

c++ stl庫中vector素有動態陣列的美譽,為什麼?我想有以下幾個原因:

1)它能夠彌補普通陣列(如「int a[8]」)只能固定長度的缺陷;

2)它能彌補一般堆陣列(如int *p = new int[n])需要預先知道長度,並且長度不可變的缺陷。

在有些情況下,比如從檔案中讀取一組未知長度的float型的資料。

3)相對stl中其他容器,如list,vector與陣列更接近,它內部的資料儲存在一片連續的儲存空間,訪問效率會更高;而list是鍊錶,資料在儲存空間上不相鄰。

vector的「動態陣列」的美譽的另一體現是,它與陣列的靈活互轉。

一、陣列轉vector

利用vector的建構函式,可以很方便的將陣列轉為vector。例如:

float arrheight = ;

vectorvecheight(arrheight, arrheight+sizeof(arrheight)/sizeof(float));

關於vector的構造,有如下幾種:

default (1)

explicit vector (const allocator_type& alloc = allocator_type());

fill (2)

explicit vector (size_type n);

vector (size_type n, const value_type& val,

const allocator_type& alloc = allocator_type());

range (3)

template vector (inputiterator first, inputiterator last,

const allocator_type& alloc = allocator_type());

copy (4)

vector (const vector& x);

vector (const vector& x, const allocator_type& alloc);

move (5)

vector (vector&& x);

vector (vector&& x, const allocator_type& alloc);

initializer list (6)

vector (initializer_listil,

const allocator_type& alloc = allocator_type());

上述例子用的就是第三種,range建構函式。我在vs2015下進行了實驗,通過檢視記憶體,可以發現,vecheight的資料部分的記憶體位址和arrheight是相同的,也就是說,上述例子中,沒有真正進行資料拷貝,這裡應該是用到了「寫時複製」的技術,提高了資料複製的效率。

此外,可以參考部落格:

二、vector轉陣列

由於vector內部的資料是存放在連續的儲存空間,vector轉陣列事實上只需要獲取vector中第乙個資料的位址和資料的長度即可。如果僅僅是傳參,無需任何操作,直接傳位址即可,如果要進行資料複製,可以借用記憶體拷貝函式「memcpy」。例如:

float *buffer = new float[vecheight.size()];

if (!vecheight.empty())

三、應用建議

1,vector作為動態陣列,它的實現方法是:預先分配乙個記憶體塊,當感覺不夠用的時候,再分配乙個更大的記憶體塊,然後自動將之前的資料拷貝到新的記憶體塊中。

所以,出於效率考慮,如果實現知道待儲存的資料長度,可以使用resize函式開闢足夠的記憶體,避免後續的記憶體拷貝。

2,如果陣列的元素是字元,建議使用string,而不是vector。

附兩篇博文,談vector等容器的效率問題:

STL vector 不定長陣列

包含在vector標頭檔案中 使用方式為 vector int vec 定義了乙個vec陣列 vector int vec 10 定義了元素數,各元素都為0 有 size 函式 返回陣列元素數,即陣列大小 resize 函式 重置陣列大小 push back argu 函式向後新增元素argu po...

STL vector與list的區別

標準庫定義了三種順序容器型別 vector list和deque 雙端佇列double end queue 他們的差別在於訪問元素的方式以及對容器進行插入 刪除等相關操作的執行代價不同。vector 支援快速隨機訪問 list 支援快速插入 刪除 deque 雙端佇列vector是順序儲存,其位址空...

java byte陣列與String互轉

方法 使用string.getbytes charset 實現 string website string byte,並指定字符集 byte b website.getbytes utf 8 列印轉換結果 system.out.println arrays.tostring b 方法 使用new s...