2009-04-25 14 views
11

Tôi vượt qua một Iterator và tôi phải chuyển nó vào một chức năng khác - nhưng được lọc để các phần tử nhất định bị bỏ qua (đó là một loạt các con trỏ, và tôi muốn lọc ra các con trỏ NULL).boost :: filter_iterator - làm thế nào tôi sẽ làm điều đó với STL?

Tôi googled cho "trình lặp bộ lọc stl lọc" để xem cách thực hiện việc này và boost::filter_iterator xuất hiện.

Điều đó có vẻ đẹp và tôi có thể sử dụng nó, nhưng tôi có thể làm điều đó với STL cũ tốt không? Không cần sao chép các thành phần vào một container mới, tất nhiên.

Tôi đoán tôi sẽ phải tạo một lớp trình vòng lặp khác cung cấp các chức năng cần thiết begin(), end() v.v ... và lọc không? Vì vậy, tôi muốn chính xác phải thực hiện lại boostiterator_filter ...?

Trả lời

8

Bạn là chính xác; về cơ bản bạn sẽ tự tái tạo trình tự lọc của bộ lọc. Lời khuyên của tôi là sử dụng bộ lọc filter_iterator của Boost. Boost có trạng thái đặc biệt là thư viện bên ngoài được sử dụng nhiều nhất của C++; nhiều thành viên ủy ban C++ đã giúp viết thư viện để tăng cường. Tính phổ biến của nó chủ yếu làm cho nó gần như là stl; không có lý do gì để phát minh lại bánh xe ở đây.

+3

Tôi hơi không đồng ý: tăng cường có thể cồng kềnh để cài đặt và đôi khi bạn không muốn phụ thuộc thêm đó. Tôi nghĩ rằng một lý do * thực * sẽ không viết lại 'filter_iterator' là nó thực sự khá khó khăn (và rất cồng kềnh) để viết chính xác. –

4

Tôi đồng ý với rlbond. Không phát minh lại bánh xe và sử dụng Boost :: filter_iterator. Nếu bạn không muốn có tất cả các thư viện tăng cường trong dự án của mình, bạn có thể cân nhắc sử dụng boost.bcp để trích xuất chính xác những thư viện bạn cần.

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