这是一些背景知识。我有一个二叉树迭代器(按顺序说)。它通过在堆栈顶部推送指针来跟踪其当前节点的父节点。现在我还想要互操作性,即将iterator
投射到const_iterator
的能力。但iterator
有std::stack<pointer>
而const_iterator
有std::stack<const pointer>
。
也赞赏任何其他达到相同效果的方式。
目前我已经放弃了完全使用std::stack
的想法。我使用std::deque
和push_back()
+ pop_back()
+ back()
。要将std::deque<pointer>
转换为std::deque<const pointer>
,我只使用std::copy( std::begin(ptrDeque), std::end(ptrDeque), std::begin(constPtrDeque) );
,此设置 只需 。
出于好奇,我仍然希望得到这个问题的答案。
答案 0 :(得分:1)
在const_iterator中保留一个非常量堆栈。它是一个私人数据成员,所以它并不重要。
确保您的const_iterator实现没有通过指针进行修改。要确保双重确定,请始终使用const_iterator自己的运算符*(),它应该返回一个const引用。 (实际上,我认为你不需要多大程度地取消引用指针,但如果你这样做,那就是你应该怎么做。)
答案 1 :(得分:0)
在C ++中进行这些转换没有简单的方法。它看起来像一个演员就足够了,但它不会这样工作。
C ++ - 方法是隐藏关键数据结构并管理不同API的访问。
是的,这意味着您在某一点上的const
比期望的要少。但这就是隐藏的目的。
只要它只是在实施中,没有其他人可以滥用它。
如果你在一个专用的类中封装你的stack / deque / [我猜vector
就足够了],你可以非常接近所需的解决方案。在内部它保留非常量指针,但所有const
方法都返回const pointer
s。如果你的迭代器只通过getter访问它,那么就不可能意外地绕过const
。