2011-07-09 30 views
14

Bộ nhớ có ở std::array liền kề không? Thực hành tốt/hợp lệ sau đây?Bộ nhớ trong std :: array tiếp giáp?

std::array<type1,Num> arr = //initialize value 
type1 * ptr = &arr[0]; 

Tôi có thể chuyển ptr cho các chức năng mong đợi một mảng kiểu c không?

+0

Bạn đã quên một '&'? – Mehrdad

+0

Vâng, tôi đã làm. Cảm ơn vì đã tìm ra điều đó. – brian

Trả lời

28

Có, nó liền kề, vì cơ bản là (và thực sự) là type arr[10];, nhưng với giao diện giống như STL. Nó cũng không phân rã thành con trỏ trên sự khiêu khích nhỏ nhất.

Bạn có thể chuyển an toàn &arr[0] sang chức năng mong đợi một mảng kiểu C, đó là mục tiêu thiết kế của nó. Để sử dụng nó với các thuật toán STL Tuy nhiên, chỉ cần sử dụng beginend chức năng:

// either members 
std::sort(arr.begin(), arr.end()); 
// or free from <iterator> 
std::sort(std::begin(arr), std::end(arr)); 

Đối với phần luật sư ngôn ngữ, §23.3.2.1 [array.overview] p1:

Tiêu đề <array> định nghĩa một lớp mẫu để lưu trữ chuỗi các đối tượng có kích thước cố định. Một mảng hỗ trợ các trình vòng lặp truy cập ngẫu nhiên. Một ví dụ của array<T, N> cửa hàng N các yếu tố thuộc loại T, do đó size() == N là một bất biến. Các phần tử của array được lưu trữ liên tục, có nghĩa là nếu aarray<T, N> thì nó tuân theo nhận dạng &a[n] == &a[0] + n cho tất cả 0 <= n < N.

§23.3.2.1 [array.overview] p2:

Một mảng là một tổng hợp (8.5.1) có thể được khởi tạo với cú pháp

  • array<T, N> a = {initializer-list};

Ngoài ra, trong p3, danh sách các thành viên của std::array:

T elems[N]; // exposition only
[Lưu ý: Thành viên biến elems được hiển thị cho triển lãm duy nhất, nhấn mạnh rằng array là một tập hợp lớp. Tên elems không phải là một phần của giao diện của array. —thêm ghi chú]

+0

Tiêu chuẩn nêu rõ rằng 'std :: vector' sẽ có phân bổ bộ nhớ tiếp giáp, Tương tự như trường hợp với std :: array? –

+0

Và chức năng @Xeo có vẻ bị hỏng, tên không bao giờ hiển thị .. –

+0

@Lý: Trước tiên, tôi nhận được thông báo về nhận xét cho câu trả lời của tôi dù sao, thứ hai, có. :) – Xeo

0

Có bộ nhớ std::array liền kề nhau. Trên VC10, nó được khai báo là:

template<class _Ty, 
    size_t _Size> 
    class array 
    { // fixed size array of values 
       ... 
     _Ty _Elems[_Size == 0 ? 1 : _Size]; 
    }; 

Trường hợp _Elemes không là gì ngoài một mảng đơn nhất.

+1

Đây chỉ là một triển khai của 'std :: array'. Câu trả lời của bạn là chính xác, nhưng biện minh của bạn không hợp lệ. Các triển khai khác có thể viết lớp khác nhau. Lý do họ không thể là vì nó sẽ vi phạm các đặc điểm kỹ thuật. Bạn quên đề cập đến điều đó. –

+0

Có thể, mua triển khai GNU sử dụng cùng một cách tiếp cận: http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01741.html – Ajay

Các vấn đề liên quan