使用 stdvector 作為 C 陣列

有幾種方法可以將 std::vector 用作 C 陣列(例如,為了與 C 庫相容)。這是可能的,因為向量中的元素是連續儲存的。

Version >= C++ 11

std::vector<int> v{ 1, 2, 3 };
int* p = v.data();

與基於先前 C++標準的解決方案(見下文)相比,成員函式 .data() 也可以應用於空向量,因為在這種情況下它不會導致未定義的行為。

在 C++ 11 之前,你將獲取向量的第一個元素的地址以獲取等效指標,如果向量不為空,則這兩個方法都是可互換的:

int* p = &v[0];      // combine subscript operator and 0 literal

int* p = &v.front(); // explicitly reference the first element

注意: 如果向量為空,則 v[0]v.front() 未定義且無法使用。

儲存向量資料的基址時,請注意許多操作(如 push_backresize 等)可以更改向量的資料儲存位置,從而使先前的資料指標無效 。例如:

std::vector<int> v;
int* p = v.data();
v.resize(42);      // internal memory location changed; value of p is now invalid