2012-03-19 8 views
6

Có một số "tiêu chuẩn" container (STL, tăng) có thể trình bày nhiều khối bộ nhớ như một liên tục duy nhất? Tôi cần phải làm việc với một số dữ liệu với điều kiện sau:Container để trình bày nhiều khối bộ nhớ như một liên tục duy nhất

  • Tổng kích thước của dữ liệu không được biết trước (phản ứng web)
  • Memory được phân bổ trong khối (với một số chức năng phân bổ bên ngoài, mà tôi đã không kiểm soát của)
  • Memory giải phóng không được kiểm soát bởi tôi, vì vậy tái phân bổ tương đối đắt

vì vậy, sau khi nhận được tất cả các dữ liệu, tôi có một danh sách các khối bộ nhớ. Và tôi cần phải áp dụng một số thuật toán STL (tìm kiếm, sao chép, vv) cho toàn bộ dữ liệu. Có một giải pháp để viết container để giữ thông tin về các khối này + iterator chuyển tiếp có khả năng "nhảy" từ đoạn này sang đoạn khác.

Nhưng vấn đề có vẻ khá chung chung, vì vậy tôi hy vọng rằng có một số câu trả lời nổi tiếng mà tôi đang thiếu. Cảm ơn trước.

Trả lời

4

Bộ nhớ được cung cấp cho bạn, bạn nói. Nghe có vẻ như bạn không muốn sao chép nó. Không có vấn đề gì, triết lý STL khá linh hoạt. Bạn không thực sự cần một container; họ chỉ ở đó để quản lý bộ nhớ và đã được chăm sóc.

Điều bạn làm cần là một trình lặp. Không có tiêu chuẩn nào; bạn sẽ phải tự viết cho mình. Chỉ có quá nhiều biến thể nhỏ để cung cấp giải pháp chuẩn cho việc này. Nhưng đừng lo lắng, nó khá dễ dàng. Bạn nhận được các typedef cần thiết nếu bạn kế thừa từ std::iterator<value_type>, vì vậy bạn chỉ cần viết operator* (đơn giản) và operator++/operator--/operator+/operator- (hiểu khối này).

+0

Tôi hoàn toàn đồng ý rằng tôi cần một iterator và tôi đã đề cập nó như là một giải pháp có thể. Nhưng sử dụng một iterator mà không có một container trông lạ đối với tôi. Bởi vì tôi nên lấy 'begin()' và 'end()' của mình bằng cách nào đó, vì vậy đóng gói những thứ này trong container có vẻ tự nhiên. Có lẽ từ _container_ bị lạm dụng ở đây bởi tôi.Tôi không nói về khái niệm container STL nhưng về một số "chủ" cho các khối riêng biệt mà sẽ đóng gói chúng. Tôi chỉ có hy vọng rằng tôi không nên tự mình thực hiện những thứ này. Dù sao, cảm ơn cho một câu trả lời. –

+0

"_Container_" được xác định rõ trong C++ (chương 23 của tiêu chuẩn). – MSalters

0

Tôi cần một cái gì đó tương tự và sau khi có một cái nhìn xung quanh đã kết thúc bằng văn bản của riêng tôi, dựa trên quá tải toán tử []. Đối với Q & liên quan Khi xem các chủ đề sau;

Can I use the [] operator in C++ to create virtual arrays

Good C++ array class for dealing with large arrays of data in a fast and memory efficient way?

+0

'toán tử []' hoàn toàn không liên quan đến các thuật toán như 'std :: copy' và' std :: search'. – MSalters

0

Vì vậy, sau khi nhận được tất cả các dữ liệu, tôi có một danh sách các khối bộ nhớ. Và tôi cần phải áp dụng một số thuật toán STL (tìm kiếm, sao chép, vv) cho toàn bộ dữ liệu. Có một giải pháp để viết container để giữ thông tin về các khối này + iterator chuyển tiếp có khả năng "nhảy" từ đoạn này sang đoạn khác.

Có vẻ như bạn cần một trình lặp đi lặp lại tất cả các đoạn của bạn liền mạch. std::deque<> cung cấp một trình lặp tương tự vì nó cũng cấp phát bộ nhớ theo khối.

Trừ khi bạn thực sự cần nó ở trong một khối bộ nhớ liền kề nhau. Trong trường hợp này tất cả các khối sẽ cần phải sao chép vào một mảnh liên tục của bộ nhớ.