c++ - 在 std::vector<std::unique_ptr<T>> 中迭代 const T&

标签 c++ c++11 vector iterator unique-ptr

我有一堂这样的课:

class RPNExpr
{
    std::vector<std::unique_ptr<Expr> > m_exprs;
};

m_exprs 的每个元素都由构建器函数进行堆分配,应该可以被其他类读取,但纯粹由 RPNExpr 所有,并且应该在 RPNExpr 超出范围时被销毁。

如果 m_exprs 的读者能够获得 const Expr& 上的迭代器,即隐藏 vector 持有 unique_ptrs 事实的迭代器,那就太好了。我希望这样做是为了与其他类保持一致,这些类将 unique_ptrs 保存到它们的数据并向它们返回 const T& 。

其界面可能类似于:

class RPNExpr
{
public:
    SomeIterator expr_begin();
    SomeIterator expr_end();
private:
    std::vector<std::unique_ptr<Expr> > m_exprs;
};

然后,使用者应该能够使用标准迭代器运算符来迭代 Exprs。

有什么好的方法可以做到这一点吗?我应该编写一个抽象指针的 vector 包装器吗?我是否应该根本不这样做并在 vector 中使用 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

关于c++ - 在 std::vector<std::unique_ptr<T>> 中迭代 const T&,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25669120/

相关文章:

c++ - 是否可以在 qt 中自定义 slider ?

c++ - 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

c++ - 递归调用模板函数 (C++)

c++ - 混用 std: :'s and boost::' s::bind 和::function 会导致问题吗?

c++ - vector 在递归调用中使用时与数组有何不同?

c++ - 从 vector 映射中查找并删除 std::function 对象

c++ - 如何从 DLL 中写入浮点值?

c++ - 由另一个字符串的第一个字符组成的字符串 - 为什么它还打印完整的原始字符串?

c++ - 如何将 MinGW bin 目录添加到我的系统路径?

c++ - 按常量 id 对自定义类型的 vector 进行排序