有没有办法将std :: stack <pointer>转换为std :: stack <const pointer =“”>?</const> </pointer>

时间:2012-10-02 05:37:30

标签: c++ stl iterator stack

这是一些背景知识。我有一个二叉树迭代器(按顺序说)。它通过在堆栈顶部推送指针来跟踪其当前节点的父节点。现在我还想要互操作性,即将iterator投射到const_iterator的能力。但iteratorstd::stack<pointer>const_iteratorstd::stack<const pointer>

也赞赏任何其他达到相同效果的方式。

修改

目前我已经放弃了完全使用std::stack的想法。我使用std::dequepush_back() + pop_back() + back()。要将std::deque<pointer>转换为std::deque<const pointer>,我只使用std::copy( std::begin(ptrDeque), std::end(ptrDeque), std::begin(constPtrDeque) );,此设置 只需

出于好奇,我仍然希望得到这个问题的答案。

2 个答案:

答案 0 :(得分:1)

在const_iterator中保留一个非常量堆栈。它是一个私人数据成员,所以它并不重要。

确保您的const_iterator实现没有通过指针进行修改。要确保双重确定,请始终使用const_iterator自己的运算符*(),它应该返回一个const引用。 (实际上,我认为你不需要多大程度地取消引用指针,但如果你这样做,那就是你应该怎么做。)

答案 1 :(得分:0)

在C ++中进行这些转换没有简单的方法。它看起来像一个演员就足够了,但它不会这样工作。

C ++ - 方法是隐藏关键数据结构并管理不同API的访问。 是的,这意味着您在某一点上的const比期望的要少。但这就是隐藏的目的。 只要它只是在实施中,没有其他人可以滥用它。

如果你在一个专用的类中封装你的stack / deque / [我猜vector就足够了],你可以非常接近所需的解决方案。在内部它保留非常量指针,但所有const方法都返回const pointer s。如果你的迭代器只通过getter访问它,那么就不可能意外地绕过const