繁体   English   中英

如何包装 boost::circular_buffer 的迭代器?

[英]How to wrap iterator of boost::circular_buffer?

我正在尝试使用 boost::circular_buffer 来管理队列的固定大小。

为此,我使用 class Something包装了 boost::circular_buffer 。

class Something {
  public:
    Something();
  private:
    boost::circular_buffer<int> buffer;
};

在这里,问题是 class Something should wrap iterator of buffer

例如,如果我使用std::vector<int> ,它很简单:

class Something {
  public:
    Something();
    typedef std::vector<int>::iterator Iterator;
    
    Iterator begin() { return buffer.begin(); }
    Iterator end() { return buffer.end(); }
    ...
  private:
    std::vector<int> buffer;
};

如何使用boost::circular_buffer来处理这个问题?

如果你只需要beginend ,你可以简单地使用auto返回类型(或者一般情况下的decltype(auto)

class Something {
  public:
    Something();
    auto begin() { return buffer.begin(); }
    auto end() { return buffer.end(); }
  private:
    boost::circular_buffer<int> buffer;
};

您可以执行与std::vector完全相同的操作。

typedef std::vector<int>::iterator Iterator; 声明一个名为Iterator的本地类型,它是std::vector<int>的迭代器类型的别名。

所以从逻辑上讲,您应该能够将std::vector<int>换成boost::circular_buffer<int>并且它应该直接放入:

#include <boost/circular_buffer.hpp>

class Something {
  public:
    Something();

    typedef boost::circular_buffer<int>::iterator Iterator;
    
    Iterator begin() { return buffer.begin(); }
    Iterator end() { return buffer.end(); }

  private:
    boost::circular_buffer<int> buffer;
};

您可以通过为容器本身使用第二个类型别名来进一步清理它。 这样,您可以通过更改一行代码来更改容器类型,其他一切都从那里开始。

#include <boost/circular_buffer.hpp>

class Something {
  public:

    Something();

    using container_type = boost::circular_buffer<int>;
    using iterator = container_type::iterator;
    
    iterator begin() { return buffer.begin(); }
    iterator end() { return buffer.end(); }

  private:
    container_type buffer;
};

注意我使用using而不是typedef因为它通常被认为在现代代码中更容易阅读,但含义是相同的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM