C++ 11 cung cấp các phương pháp data()
trên std::vector
mà trả về một T*
. Điều này cho phép bạn thực hiện:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vector = {1,2,3,4,5};
int* array = vector.data();
std::cout << array[4] << std::endl; //Prints '5'
}
Tuy nhiên, việc này (hoặc bất kỳ phương pháp nào được đề cập ở trên) có thể nguy hiểm vì con trỏ có thể không hợp lệ nếu véc-tơ được thay đổi kích thước. Điều này có thể được hiển thị với:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vector = {1,2,3,4,5};
int* array = vector.data();
vector.resize(100); //This will reserve more memory and move the internal array
//This _may_ end up taking the place of the old array
std::vector<int> other = {6,7,8,9,10};
std::cout << array[4] << std::endl; //_May_ now print '10'
}
Điều này có thể gây tai nạn hoặc làm mọi thứ vì vậy hãy cẩn thận khi sử dụng.
Trong C++ 11 cách thích hợp là 'theVector.data()'. – ildjarn
Lưu ý rằng '& theVector [0]' không sinh ra một mảng *, mà là một con trỏ *. Con trỏ và mảng là những thứ khác nhau trong ngôn ngữ, với các loại khác nhau. Bạn không thể * chuyển đổi * một véc tơ thành một mảng theo bất kỳ cách thức tiêu chuẩn nào, mặc dù cách tiếp cận của bạn là một cách tiêu chuẩn để có được một con trỏ * cho dữ liệu. –
Tôi sẽ không gọi sự tấn công này là khả năng tương thích với các API C sử dụng các con trỏ mảng là một quyết định thiết kế trong STL. Cách khác, đôi khi được nhìn thấy & * theVector.begin(), không nên được sử dụng. – aselle