如何包装boost::circular _buffer的迭代器



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

为此,我使用类Something包装boost::circular _buffer。

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

这里的问题是类Something应该包装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,因为它在现代代码中通常被认为更容易阅读,但含义是一样的。

最新更新