gpt4 book ai didi

c++ - 如何使用 const 数据构造自定义 const_iterator?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:56:52 24 4
gpt4 key购买 nike

我正在为自定义容器(一些 HashMap 类)编写迭代器类,我们称这个容器为 Map

出于几个原因,从 const_iterator 派生 iterator 似乎很方便,我已经在其他一些自定义容器(数组类)中这样做了,效果很好,所以我想坚持这个模式。

但现在这会导致以下问题(很笼统/抽象,对不起):

无论 const_iterator 的关键数据成员是什么(它可能是一个 Map 引用,或者指向 Map::Elements 的指针,很多方式是可能的),它必须是非常量,这样 const_iterator 和派生的 iterator 都可以在他们的方法中有意义地使用它。

但是如何在处理常量 Map 对象时以正确的方式初始化这个非常量数据成员(例如调用方法 const_iterator Map::Begin( void )常量)?


为了说明我的问题,我写了一些示例代码,通过使用 const_cast 解决了这个问题,我想这是一种糟糕的风格:

#include <vector>

template< typename K, typename T >
class Map
{
public:
class const_iterator
{
public:
const_iterator( Map const & a_Map, int a_Index ) :
m_Index( a_Index ),
m_Map( const_cast< Map & >( a_Map ) ) // Note the use of const_cast
{
}
private:
Map & m_Map;
int m_Index;
};
class iterator : public const_iterator
{
public:
T & operator * ( void )
{
return m_Map.mElements[ m_Index ];
}
};
public:
const_iterator Begin( void ) const { return const_iterator( *this, 0 ); }
iterator Begin( void ) { return iterator( *this, 0 ); }
private:
std::vector< T > m_Elements;
};

最佳答案

当我过去玩这个的时候,我说服自己继承不是一个好主意。虽然 iteratorconst_iterator 可能共享很多代码,但它们在接口(interface)中并没有真正共享太多。

相反,我使用模板来实现代码重用,因此 iteratorconst_iterator 只是同一模板的两个版本。提供适当的隐式转换运算符。

但是如果你坚持继承模型,并且不希望你的迭代器有自己的非常量引用(即它的构造函数初始化它的非常量版本和基类的常量版本),那么 我认为 const_cast 是唯一真正的选择。

关于c++ - 如何使用 const 数据构造自定义 const_iterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8480404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com