0

这里有一些背景。我有一个二叉树迭代器(比如按顺序)。它通过将指针压入堆栈顶部来跟踪其当前节点的父节点。现在我还想要互操作性,即转换为的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) );,而且这个设置很简单

出于好奇,我仍然想回答这个问题。

4

2 回答 2

1

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

确保您的 const_iterator 实现不会通过指针进行修改。再次确定,请始终使用您的 const_iterator 自己的 operator*() ,它应该返回一个 const 引用。(实际上,我认为您不需要过多地取消引用指针,但如果您这样做,就是这样。您应该这样做。)

于 2012-10-02T05:54:39.090 回答
0

在 C++ 中进行此类转换并不容易。看起来一个演员就足够了,但它不是这样工作的。

C++ 方式是隐藏关键数据结构并管理不同 API 的访问。是的,这意味着在某一时刻,您拥有的const比期望的要少。但这就是隐藏的目的。只要它只是在实现中,其他人就不能滥用它。

vector如果您将堆栈/双端队列/任何[我想就足够了] 封装在一个专用类中,您可以非常接近所需的解决方案。在内部它保留非常量指针,但所有const方法都返回const pointers。如果您的迭代器仅通过 getter 访问它,则应该不可能绕过它const

于 2012-10-02T07:34:06.297 回答