【问题标题】:What is the best approach for wrapping an STL container in a custom iterator?在自定义迭代器中包装 STL 容器的最佳方法是什么?
【发布时间】:2015-05-21 11:18:24
【问题描述】:

为了说明,假设我有一个自定义容器,而不是在内部使用 STL std::vector。如果我 typedef std::vector<char*>::iteratormy_container::iterator,那么取消引用迭代器将返回一个 char*。但是,我的自定义容器应该隐藏其内部,这意味着我希望取消引用返回 char

如何做到这一点?

class my_container {
public:

    typedef std::vector<char*> vector;

private:

    vector vec_;

};

更新:char* 就是一个例子。这并不意味着 C 字符串;使用int 会更清楚示例。

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

【问题讨论】:

  • 您可能需要实现自己的迭代器,一个在两个级别上进行迭代的迭代器(实际迭代器的char* 和解引用运算符的char)。
  • char 是从哪里来的,你的意思是要遍历向量中的每个子字符串还是仅仅解引用两次?

标签: c++ iterator containers template-meta-programming


【解决方案1】:

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

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

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

如果您尝试后遇到困难,请发布您的尝试,我们会进一步帮助您。

【讨论】:

    【解决方案2】:

    最佳方法?唷!,一个棘手的问题。

    一个方法是使用由 boost.org 上的好人专门为此目的创建的非常有用的框架:

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

    【讨论】:

    • 是的,这个库恰到好处。
    【解决方案3】:

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

    【讨论】:

    • 你可以改进你的答案,解释它是如何回答问题的
    • 如果包装的向量是成对的向量,我只想公开每对中的第二个怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2017-01-14
    • 2017-01-06
    相关资源
    最近更新 更多