使用 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_back
,resize
等)可以更改向量的資料儲存位置,從而使先前的資料指標無效 。例如:
std::vector<int> v;
int* p = v.data();
v.resize(42); // internal memory location changed; value of p is now invalid