2013-12-16 18 views
5

Câu hỏi của tôi được thúc đẩy một phần bởi this question.Có thể soạn các thuật toán STL không có một thùng chứa trung gian

Có cách nào để soạn các thuật toán STL hoặc thuật toán do người dùng tạo, không có vùng chứa trung gian không? Câu trả lời có thể sử dụng công cụ để tăng tốc, nhưng giả sử thuật toán được tạo ra là do người dùng tạo hoặc từ STL.

Vì vậy, boost::adaptors::reversed không được tính vì thuật toán đảo chiều đang tăng.

+0

Giả định nào về thuật toán mà người dùng thực hiện hoặc từ STL loại trừ câu trả lời đã cho? – polkadotcadaver

+0

@PaulDraper Không nói rằng khi tôi viết bình luận :) – polkadotcadaver

+0

"Câu hỏi của tôi là một phần thúc đẩy bởi câu hỏi này." - làm thế nào là điều này * một phần động lực * và không phải là một bản sao? –

Trả lời

7

số

Hãy nói rằng fg những thuật toán STL.

Hãy nói điều bạn muốn là f(g(x)) (Tôi đang cố truyền đạt ý tưởng ở đây ...).

Không có cách nào để có được xung quanh có một container trung gian, vì kết quả của g(x) phải là một container.

Nếu bạn định tránh các thùng chứa trung gian, bạn phải sử dụng các thuật toán có thể "kiểm tra" hoặc tương tác với các thuật toán khác, như Boost.Range adaptors (ví dụ: boost::adaptors::reversed). Ví dụ, f là "sắp xếp" và g là "đảo ngược". Bộ điều hợp của Boost có thể nhận ra rằng bước ngược lại là một no-op và bỏ qua nó. Thuật toán STL không thể làm điều đó, vì không có cách nào để thông tin đó có thể vượt qua được.

+0

Vì vậy, không có "adapter adapter", có thể biến 'std :: reversed' thành một loại 'boost :: adapters :: reversed'? Tôi sẽ không muốn viết lại một trình bao bọc cho mọi thuật toán độc lập mà tôi có thể có. – Polymer

+0

@Polymer, tôi không chắc chắn về việc viết lại một wrapper; Tôi nghĩ bạn sẽ viết một thuật toán tương thích 'boost :: adaptors'. Nhưng câu trả lời là có, bạn không thể "bí mật" (?) 'Std :: reversed' thành' boost :: adapters :: reversed' –

+0

Chuyển đổi là một từ tốt hơn, cảm ơn. – Polymer

1

Có cho các thuật toán tương thích với bộ lặp đầu vào và đầu ra.

Nó yêu cầu chủ đề để lưu trữ trạng thái thực thi, hoặc một cái gì đó như coroutine.

Mỗi bước ghi vào một trình vòng lặp đầu ra sẽ ngừng thực thi và chạy thuật toán tiếp theo. Tương tự như vậy đọc từ giá trị đầu vào tiếp theo dừng lại rằng thread thực hiện và chờ đợi trên nó đã sẵn sàng.

Nhiều người <algorithms> không phù hợp với những hạn chế ở trên. Nhưng những người làm nên ghi lại yêu cầu của họ. transform đủ điều kiện, tôi không thể nghĩ ra những người khác ngoài đỉnh đầu của tôi.

+0

Đây là một câu trả lời thực sự thú vị. Hãy để tôi xem nếu tôi hiểu. Bạn có một trình vòng lặp thực thi hoãn lại, chúng ta sẽ gọi là 'defIter'. Hàm khởi tạo của nó chấp nhận một thuật toán (với một giao diện chấp nhận các trình vòng lặp đầu vào). Chúng ta đang viết một thuật toán dùng '[inA, inB)' và xuất ra '[outA, outB)' trong đó 'inA, inB' là các bộ lặp đầu vào và' outA, outB' là các trình vòng lặp đầu ra. Mã "được tạo" sẽ trông giống như 'first_algorithm (inA, inB, defIter {second_algorithm, outA, outB})'. 'second_algorithm' sẽ đọc từ các trình vòng lặp đầu vào sẽ trả về thực thi trở lại' first_algorithm'. – Polymer

+0

@Polymer yep, nghe có vẻ đúng. Nếu bạn có một số phần mở rộng coroutine C++, bạn thậm chí có thể làm điều đó trong một luồng, vì việc thiếu bộ đệm có nghĩa là chúng ta đơn luồng như thế nào: luồng chỉ đơn giản tồn tại để cho phép chúng ta * ngừng xử lý 'second_algorithm' tại một điểm nơi nó thực sự không có ý định dừng lại (khi đọc từ đầu vào của nó). Lưu ý rằng 'defIter' sẽ xuất ra một trình lặp đầu ra đơn lẻ, không phải là 2. – Yakk

+0

Quyền của bạn, Nó sẽ chỉ xuất ra một trình lặp! Trước khi tôi cố gắng triển khai trình lặp này, có bất cứ điều gì trong tăng cường, hoặc một số thư viện khác, cung cấp một cái gì đó như thế này? – Polymer

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