在自定义迭代器中包装STL容器的最佳方法是什么?

What is the best approach for wrapping an STL container in a custom iterator?

本文关键字:最佳 方法 是什么 迭代器 自定义 包装 STL      更新时间:2023-10-16

为了说明,假设我有一个自定义容器,它在内部使用STL std::vector。如果我将std::vector<char*>::iterator类型定义为my_container::iterator,那么对迭代器进行解引用将返回char*。然而,我的自定义容器应该隐藏它的内部,这意味着我想要一个解引用来返回一个char

如何做到这一点?

class my_container {
public:
    typedef std::vector<char*> vector;
private:
    vector vec_;
};

UPDATE: char*为例。它不是指C字符串;如果使用int,这个例子会更清楚。

另外,我想使用std::forward_iterator_tagstd::iterator,因为这似乎是一个更标准/当前的方法。

如果您想要自己的迭代器,只需开始将其作为嵌套类编写。它需要包装一个std::vector<char*>::iterator,拦截通常的操作(例如++, *, --),类似于:

class iterator
{
  public:
    iterator& operator++() { ++i_; return *this; }
    char& operator*() { return **i_; }
    ...etc...
  private:
    std::vector<char*>::iterator i_;
};

?唷!,很难回答的问题。

一种 方法是使用非常有用的框架,这个框架是由boost.org上的好家伙创建的:

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

使用boost::indirect_iterator

编辑(未测试):

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_;
};