2012-10-31 36 views
9

Tôi có thể tạo một số std::vector bằng dữ liệu đã tồn tại trước của tôi thay vì phân bổ bộ nhớ mới và sao chép dữ liệu không? Để rõ ràng hơn, nếu tôi có một khu vực bộ nhớ (hoặc là một mảng c hoặc một phần của véc tơ khác hoặc bất kỳ thứ gì) và tôi muốn cung cấp quyền truy cập giống như véc-tơ, tôi có thể tạo một véc-tơ và yêu cầu nó sử dụng không khối bộ nhớ này?C++ STL vector cho dữ liệu hiện có

+1

thế nào thì bạn sẽ sử dụng vector đó? – Andrey

+0

Có lẽ sẽ tốt hơn nếu không sử dụng 'vectơ' hoặc các thùng chứa tương tự. Tại sao bạn muốn đưa dữ liệu của mình vào một vùng chứa riêng biệt? –

+1

Điều quan trọng là phải biết cách bạn sẽ sử dụng vectơ. Ví dụ trong câu trả lời của Luchian, vector kết quả sẽ không phải là một 'vector ', nó sẽ là một 'vector '. Vì vậy, nếu lý do bạn cần một vectơ là chuyển nó đến một hàm nào đó mà mong đợi một 'vector ' thì điều đó sẽ không giúp bạn. Nếu bạn cần vector cho một số mục đích khác thì có lẽ nó sẽ giúp bạn. –

Trả lời

7

Không, nhưng bạn có thể viết lớp của riêng bạn thực hiện việc này. Vì đây sẽ là một nhu cầu khá phổ biến, tôi sẽ không ngạc nhiên nếu ai đó đã làm điều này rồi.

Tuy nhiên, cách C++ bình thường là viết mã mẫu để hoạt động trên các trình vòng lặp. Bạn có thể tạo các trình vòng lặp cho bất kỳ phần nào của một vectơ, hoặc cho bất kỳ phần nào của một mảng C (và nhiều phần khác). Vì vậy, viết mã mẫu cho vòng lặp có lẽ là những gì bạn nên làm.

+1

Tại sao một trình phân bổ tùy chỉnh sẽ không hoạt động? –

+0

Bạn có thể giải thích điều này thêm một chút không? Bạn có nghĩa là để tạo ra một lớp templated với một giao diện giống như vector chấp nhận iterators để constructor của nó và sử dụng chúng trong nội bộ? – baruch

+1

Tại sao một người nên cố gắng phát minh lại bánh xe khi người phân bổ có thể thực hiện công việc? "Vectơ" mới có thể có 99% mã chung với 'std :: vector'. – Acorbe

2

Vì bạn có thể sử dụng trình phân bổ tùy chỉnh khi tạo một vector, về mặt kỹ thuật, điều đó là có thể.

Tuy nhiên, tôi sẽ không khuyên bạn nên sử dụng. Tôi chỉ cần tạo ra một vector với một kích thước cố định (rõ ràng bạn có thể có được một tổ chức đó) và sau đó sử dụng std::copy.

+0

Điều gì sẽ xảy ra nếu mảng hiện có có kích thước 'n' và vì bất kỳ lý do gì mà vectơ yêu cầu cấp phát cho không gian có kích thước' n + 1'? Tôi không nói điều đó chắc chắn sẽ xảy ra, nhưng tôi khá chắc chắn tiêu chuẩn cho phép 'vectơ' phân bổ quá mức bởi bất kỳ lề nào nó thích, và sử dụng không gian dư thừa vào cuối phân bổ của nó cho bất cứ thứ gì nó thích. Bạn có lẽ có thể viết các cấp phát để thông báo bất cứ điều gì khó chịu xảy ra, và rơi trở lại hành xử như một người cấp phát bình thường. –

1

Thuật toán lặp qua vùng chứa chấp nhận một cặp vòng lặp xác định phạm vi nhập. Bạn có thể sử dụng thuật toán với các trình vòng lặp trỏ đến giữa một vùng chứa lớn.

Ví dụ:

std::vector<int> big_vector(100000); 
// initialize it 
//... 
std::sort(big_vector.begin()+100, big_vector.begin()+200); // sort a subrange 

int big_array[100000]; //c-style array 
// initialize it 
//... 
std::sort(std::begin(big_array)+300, std::begin(big_array)+400); // sort a subrange 
Các vấn đề liên quan