2015-05-21 18 views
6

Để minh họa, giả sử tôi có vùng chứa tùy chỉnh hơn là sử dụng STL std::vector nội bộ. Nếu tôi đã nhập std::vector<char*>::iterator vào số my_container::iterator, thì dereferencing trình lặp sẽ trả về char*. Tuy nhiên, container tùy chỉnh của tôi nên ẩn nội bộ của nó, có nghĩa là tôi muốn một dereferencing để trả lại một char.Cách tiếp cận tốt nhất để bao gói một container STL trong một iterator tùy chỉnh là gì?

Làm cách nào để thực hiện điều này?

class my_container { 
public: 

    typedef std::vector<char*> vector; 

private: 

    vector vec_; 

}; 

UPDATE:char* là một ví dụ. Nó không có nghĩa là một chuỗi C; ví dụ sẽ rõ ràng hơn với một số int.

Ngoài ra, tôi muốn sử dụng std::forward_iterator_tagstd::iterator vì điều này có vẻ là phương pháp tiếp cận chuẩn/hiện tại hơn.

+0

Bạn có thể cần phải thực hiện lặp của riêng bạn, một trong đó lặp trên hai cấp độ ('char *' của iterator thực tế, và 'char' cho toán tử tham chiếu của bạn). –

+0

Trường hợp nào 'char' đến từ, bạn có nghĩa là được lặp trên mỗi chuỗi con trong vector hoặc chỉ dereferencing hai lần? – Barry

Trả lời

5

Nếu bạn muốn trình lặp của riêng bạn, chỉ cần bắt đầu viết nó như là một lớp lồng nhau. Nó sẽ cần phải quấn một std::vector<char*>::iterator, chặn các hoạt động bình thường (ví dụ ++, *, --), một cái gì đó như:

class iterator 
{ 
    public: 
    iterator& operator++() { ++i_; return *this; } 
    char& operator*() { return **i_; } 
    ...etc... 

    private: 
    std::vector<char*>::iterator i_; 
}; 

Nếu bạn thử nó và gặp khó khăn, gửi nỗ lực của bạn và chúng tôi sẽ giúp bạn thêm.

4

tốt nhất cách nào? phew !, câu hỏi khó.

một cách là sử dụng khuôn khổ rất hữu ích mà đã được tạo ra cho chính xác mục đích này bởi các folks đẹp tại boost.org:

http://www.boost.org/doc/libs/1_58_0/libs/iterator/doc/

+0

Yup, thư viện này đã có mặt tại chỗ. –

1

Sử dụng boost::indirect_iterator.

EDIT: (chưa được kiểm tra)

struct S 
{ 
    using iterator = 
     boost::indirect_iterator<std::vector<char*>::iterator>; 
    using const_iterator = 
     boost::indirect_iterator<std::vector<char*>::const_iterator>; 

    iterator begin() { return iterator(vec_.begin()); } 
    iterator end() { return iterator(vec_.begin()); } 
    const_iterator begin() const { return const_iterator(vec_.begin()); } 
    const_iterator end() const { return const_iterator(vec_.begin()); } 
private: 
    std::vector<char*> vec_; 
}; 
+1

bạn có thể cải thiện câu trả lời của bạn giải thích cách nó trả lời cho câu hỏi – mpromonet

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