2011-12-30 28 views
11

Tôi biết bạn chỉ có thể làm: &theVector[0], nhưng là tiêu chuẩn này? Hành vi này có bị giữ luôn luôn không?Chuyển đổi vectơ thành mảng - Có cách nào 'chuẩn' để thực hiện việc này không?

Nếu không, có cách nào tốt hơn, ít 'hack' để thực hiện việc này không?

+5

Trong C++ 11 cách thích hợp là 'theVector.data()'. – ildjarn

+3

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. –

+0

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

Trả lời

20

Có, hành vi đó được đảm bảo. Mặc dù tôi không thể báo giá nó, tiêu chuẩn đảm bảo rằng các phần tử vectơ được lưu trữ liên tục trong bộ nhớ để cho phép điều này.

Có một ngoại lệ mặc dù:

Nó sẽ không làm việc cho vector<bool> vì một template đặc biệt.

http://en.wikipedia.org/wiki/Sequence_container_%28C%2B%2B%29#Specialization_for_bool

chuyên môn hóa này cố gắng tiết kiệm bộ nhớ bằng cách đóng gói bools với nhau trong một trường bit. Tuy nhiên, nó phá vỡ một số ngữ nghĩa và như vậy, &theVector[0] trên vector<bool> sẽ không hoạt động.

Trong mọi trường hợp, vector<bool> là rộng rãi considered to be a mistake để thay thế là sử dụng std::deque<bool> thay thế.

+0

Tôi cho rằng trong trường hợp đó, tôi chỉ cần sao chép nó bằng cách sử dụng 'copy' hoặc cái gì đó? –

+1

Có một ngoại lệ khác: nếu vectơ trống, bạn không thể sử dụng toán tử subscript trên nó. –

+1

@JonathanLingle Có, bạn có thể sử dụng 'std :: copy()' để làm điều đó. – Mysticial

-1

Cách ít 'hack' hơn? Vâng, bạn chỉ đơn giản là có thể sao chép:

#include <iostream> 
#include <vector> 
using namespace std; 



int main() 
{ 
    vector<int> vect0r; 
    int array[100]; 

    //Fill vector 
    for(int i = 0; i < 10 ; i++) vect0r.push_back(i) ; 

    //Copy vector to array[ ] 
    for( i = 0; i < vect0r.size(); i++) array[i] = vect0r[i]; 

    //Dispay array[ ] 
    for( i = 0; i < vect0r.size(); i++) cout<< array[i] <<" \n"; 

    cout<<" \n"; 

return 0; 
} 

More đây: How to convert vector to array in C++

+0

'int array [vec.size()] ; 'không hợp pháp C++. Mã số – ildjarn

+0

'MAGIC_NUMBER' về mặt kỹ thuật là hợp pháp, nhưng là một điều rất xấu. Điều đó không tốt hơn. – Puppy

13

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.

0

Chúng ta có thể thực hiện điều này bằng phương thức data(). C++ 11 cung cấp phương thức này. Nó trả về một con trỏ đến phần tử đầu tiên trong vectơ. vector Ngay cả khi nó trống, chúng tôi có thể tự gọi hàm này mà không gặp sự cố

vector<int>v; 
    int *arr = v.data(); 
Các vấn đề liên quan