如何包装 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
应该包装 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
来处理这个问题?
您可以执行与 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;
};
N.B。我使用 using
而不是 typedef
因为它通常被认为在现代代码中更容易阅读,但含义是一样的。
如果您只需要 begin
和 end
,您可以简单地使用 auto
return 类型
(或一般情况下 decltype(auto)
)
class Something {
public:
Something();
auto begin() { return buffer.begin(); }
auto end() { return buffer.end(); }
private:
boost::circular_buffer<int> buffer;
};
我正在尝试使用 boost::circular_buffer 来管理队列的固定大小。
为此,我使用 class Something
.
class Something {
public:
Something();
private:
boost::circular_buffer<int> buffer;
};
这里,问题是 class 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
来处理这个问题?
您可以执行与 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;
};
N.B。我使用 using
而不是 typedef
因为它通常被认为在现代代码中更容易阅读,但含义是一样的。
如果您只需要 begin
和 end
,您可以简单地使用 auto
return 类型
(或一般情况下 decltype(auto)
)
class Something {
public:
Something();
auto begin() { return buffer.begin(); }
auto end() { return buffer.end(); }
private:
boost::circular_buffer<int> buffer;
};