2012-08-15 29 views
6

Trong thuật ngữ trừu tượng, một đường ống là một thùng chứa kiểu luồng/FIFO với một đọc phá hoại. Nó có phương thức read() sao chép các khối dữ liệu cùng một lúc và các chức năng như getput cho các byte đơn. Khi read hoặc get trả về, dữ liệu được sao chép ra khỏi đường ống sẽ bị xóa khỏi bộ đệm trong của ống - không giống như tệp hoặc bất kỳ loại vùng chứa nào khác.Có một lớp C++ STL hoạt động giống như một đường ống không?

Hầu hết (tất cả?) Của các vùng chứa STL không cung cấp read() tương tự trong lệnh đệm. Có một loại container nămo với một thành viên pop_many()?

stringstream là về điều gần nhất tôi có thể nghĩ đến vì nó duy trì một con trỏ đọc nội bộ và lần đọc trong tương lai sẽ chặn cho đến khi luồng đầy lại. Vùng chứa trống từ điểm API, nhưng dữ liệu được tiêu thụ sẽ phải là rác được thu thập thủ công.

Có một vùng chứa hoặc luồng luồng tương đương trong C++ thực hiện điều này hay là vấn đề của chính bạn (như trong ví dụ về chuỗi)?

+4

có thể là hàng đợi? – Gir

+2

Tôi có thể đặt một vòng quanh queue.pop(), nhưng nó không hiệu quả. Tôi muốn có thể xóa các khối dữ liệu lớn và hàng đợi/fifo sẽ tự động thay đổi kích thước sau khi tôi xóa chúng. –

+2

Bạn cần nó để làm gì? –

Trả lời

1

Các nhận xét đã đề cập std::deque mà ở cái nhìn đầu tiên dường như là lựa chọn tốt nhất của bạn.

Nếu cách này không hiệu quả với bạn, thì hãy sử dụng số std::list<std::vector<unsigned char> >. Bạn đặt khối trên một véc tơ tại một thời điểm, và bạn splice chúng vào một danh sách khác khi bạn đang popping. Bạn sẽ phải cung cấp một lượng nhỏ mã trình bao bọc tiện lợi và điều này có thể không đủ nếu bạn không muốn đọc tất cả các phần tử của một trong các vectơ phụ cùng một lúc.

+0

Về cơ bản API hoạt động như thế này: Người dùng chờ trên bộ mô tả tập tin cho một tin nhắn, khi tin nhắn đến, họ gọi phương thức Read để nhận byte đầu tiên để xác định loại tin nhắn (và do đó độ dài của phần còn lại của tin nhắn), sau đó vượt qua đối tượng xung quanh và các phần khác nhau của ứng dụng sử dụng phương thức Read để đọc dữ liệu vào một bộ đệm char *. Vì vậy, bây giờ, tôi đang nhìn vào 'std :: stringstream' vì nó cho tôi một phương thức đọc (char *, int), và nó tự động giảm một con trỏ nhận được. Nó cũng cung cấp phương thức readome() không chặn nếu ứng dụng cố đọc nhiều dữ liệu hơn. –

+0

BTW, Không phải API của tôi. Tôi sẽ không bao giờ làm theo cách này! –

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