2011-01-19 43 views
9

Tôi đang cố gắng để hiểu làm thế nào back_inserter công việc, và điều này là thực hiện nó mà tôi có từ SGI-STL:Back_inserter hoạt động như thế nào?

template<class C> 
class back_insert_iterator { 
protected: 
    C* container; 
public: 
    typedef C     container_type; 
    typedef output_iterator_tag iterator_category; 
    typedef void    value_type; 
    typedef void    difference_type; 
    typedef void    pointer; 
    typedef void    reference; 

    explicit back_insert_iterator(C& __x) :container(&__x) { 
    } 

    back_insert_iterator<C>& operator=(const typename C::value_type& val) { 
     container->push_back(val); 
     return *this; 
    } 

    back_insert_iterator<C>& operator*() { 
     return *this; 
    } 

    back_insert_iterator<C>& operator++() { 
     return *this; 
    } 

    back_insert_iterator<C>& operator++(int) { 
     return *this; 
    } 
}; 

Tôi hiểu hầu hết các vùng, ngoại trừ người cuối cùng ba nhà điều hành *, ++, ++ (int). Đoán của tôi cho sự tồn tại của họ là bởi vì họ cần phải hỗ trợ các hoạt động khi được đặt bên trong thuật toán STL. Ngoài ra, tôi không biết chúng được sử dụng để làm gì? Bất cứ ai có thể giúp tôi làm rõ điều này?

Cảm ơn,
Chan

Trả lời

6

Họ tồn tại bởi vì các thuật toán STL làm việc trên lặp mà phải bưu chính trước incrementable và có một toán tử tham chiếu.

cố gắng nghĩ điều này không:

(*back_inserter) = value; 
++back_inserter; 
+0

cảm ơn tuyệt vời;). Câu trả lời của bạn rất nhanh^^ – Chan

4

đoán của bạn là chính xác và không có gì hơn thế nữa là. Đó là tất cả về khái niệm OutputIterator. back_insert_iterator là một OutputIterator, điều đó có nghĩa là nó sẽ làm việc với bất kỳ thuật toán nào mong đợi OutputIterators. OutputIterator phải có các nhà khai thác được xác định nên các thuật toán như thế này có thể làm việc:

template<class InputIterator, class OutputIterator> 
OutputIterator copy(
    InputIterator first, InputIterator last, OutputIterator result) 
{ 
    while(first != last) 
     // uses operators =, * and post ++ of OutputIterator. 
     *result++ = *first++; 
    return result; 
} 
+0

cảm ơn tuyệt vời;) Tôi đã nhận nó ngay bây giờ! – Chan

1

back_inserter() trả về một back_insert_iterator, trong đó có chức năng giống như một output iterator. Cụ thể, nó phải hỗ trợ các hoạt động như tăng trước và sau, và chuyển nhượng dereference.

Nếu nó không hỗ trợ các hoạt động đó, nó không thể được sử dụng khi các trình vòng lặp đầu ra được yêu cầu.

+0

Cảm ơn;) Tôi đã nhận nó ngay bây giờ – Chan

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