【发布时间】:2011-12-12 20:30:54
【问题描述】:
我正在为自定义容器(一些哈希映射类)编写迭代器类,我们称这个容器为Map。
出于几个原因,从const_iterator 派生iterator 似乎很方便,而且我已经在其他一些自定义容器(数组类)中这样做了,效果很好,所以我想坚持这种模式。
但是现在这导致了以下问题(很笼统/抽象,对不起):
无论const_iterator 的关键数据成员是什么(可能是Map 引用,或指向Map::Elements 的指针,有多种可能),它必须是非常量 所以const_iterator 和派生的iterator 都可以在他们的方法中有意义地利用它。
但是在处理 const Map 对象(例如调用方法 const_iterator Map::Begin( void ) const)时,如何以适当的方式初始化这个非常量数据成员?
为了说明我的问题,我编写了一些示例代码,通过使用 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;
};
【问题讨论】:
-
典型的迭代器实际上根本不包含所谓的“关键数据成员”。现实生活中的(发布)迭代器和它所引用的容器之间通常没有任何联系。
-
我知道这可能是出于学术好奇心,但有一个
std::map可能会比std::vector被包装到自定义地图中表现更好。 -
@Kerrek SB 你完全正确。无论如何,这只是一个示例,“关键数据成员”可以是任何东西(例如,指向提供迭代器的 Map 的
m_Elements中的第一个元素的指针)。无论我使用什么方法,问题总是一样的。
标签: c++