在 std::vector<std::unique_ptr > 中迭代 const T&<T>
Iterating over const T& in a std::vector<std::unique_ptr<T> >
我有一个这样的类:
class RPNExpr
{
std::vector<std::unique_ptr<Expr> > m_exprs;
};
m_exprs的每个元素都是由构造器函数堆分配的,其他类应该可以读取,但它完全由RPNExpr所有,并且当RPNExpr超出范围时应该进行销毁。
对于m_ exprs的读者来说,能够在const Expr上获得迭代器将是一件好事;,即迭代器,其隐藏向量持有unique_ptrs的事实。为了与其他类的一致性,我希望这样做,这些类将unique_ptrs保存到其数据并返回const T&他们。
这个接口可能看起来像:
class RPNExpr
{
public:
SomeIterator expr_begin();
SomeIterator expr_end();
private:
std::vector<std::unique_ptr<Expr> > m_exprs;
};
然后,消费者应该能够通过使用标准迭代器运算符对Expr进行迭代。
有什么好方法吗?我应该写一个对指针进行抽象的向量包装器吗?我应该根本不这样做,并在向量中使用unique_ptrs以外的东西吗?
boost中有一个迭代器适配器可以做到这一点:
#include <boost/iterator/indirect_iterator.hpp>
...
using ExprIterator = boost::indirect_iterator<std::vector<std::unique_ptr<Expr>>::iterator>;
ExprIterator expr_begin() { return std::begin(m_exprs); }
ExprIterator expr_end() { return std::end(m_exprs; }
来源:http://www.boost.org/doc/libs/1_56_0/libs/iterator/doc/indirect_iterator.html
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- std::vector::reserve(未知m),我知道m<<;N(通常)并且知道N
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- C++运算符<<调用::ostream而不是std::osttream
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- C++重载<<具有typedef'd std::vector
- 以x的倍数填充前导零,使用std::cout<<std::十六进制
- 错误:没有匹配'运算符<<"在'std::cout
- std::pair的默认构造函数<>将基本类型(int等)设置为零
- std::ostream&operator< & lt; (std:: ostream&压力,压力& &;val)
- 将std::endl传递给std::operator<<
- std::映射<>或std::vector<>在处理大型标志集时
- 重载& lt; & lt;使用命名空间std