const_iterator 与 std::list 的迭代器
const_iterator vs iterator for std::list
除了 operator*
和 operator->
之外,std::list 的 const_iterator
和 iterator
实现之间是否存在任何重大差异。下面你可以看到我的非模板作业风格的例子来展示要点。据我了解,其余方法只是为这些 类 相互复制,例如 CTOR、operator==
、operator!=
、operator++
、operator++(int)
, operator--
, operator--(int)
.
class iterator
{
private:
Node* m_node;
public:
iterator(Node* node)
: m_node(node)
{
}
int& operator*()
{
return m_node->value;
}
Node* operator->()
{
return m_node;
}
....
}
现在const迭代器实现
class const_iterator
{
private:
Node* m_node;
public:
const_iterator(Node* node)
: m_node(node)
{
}
int operator*() const
{
return m_node->value;
}
const Node* operator->() const
{
return m_node;
}
......
}
如果这是主要区别,那么我们也应该处理重复,对吗?
您缺少下面描述的一些内容,class 还不是 "templetized",但方法与标准模板库的 one implementation 使用的方法相同.
- 两个迭代器都需要一个默认构造函数 - 这提供了一种创建空迭代器的方法,您可以稍后对其进行分配
const_iterator
必须可以从 iterator
构造 - 添加构造函数到 const_iterator
以接受 "regular" 迭代器。
就代码重复而言,这确实是一个公平的观察。但是,大多数实现都适合一行,并且 return 不同的类型,因此尝试在两个模板之间共享实现会使代码更难阅读。
除了 operator*
和 operator->
之外,std::list 的 const_iterator
和 iterator
实现之间是否存在任何重大差异。下面你可以看到我的非模板作业风格的例子来展示要点。据我了解,其余方法只是为这些 类 相互复制,例如 CTOR、operator==
、operator!=
、operator++
、operator++(int)
, operator--
, operator--(int)
.
class iterator
{
private:
Node* m_node;
public:
iterator(Node* node)
: m_node(node)
{
}
int& operator*()
{
return m_node->value;
}
Node* operator->()
{
return m_node;
}
....
}
现在const迭代器实现
class const_iterator
{
private:
Node* m_node;
public:
const_iterator(Node* node)
: m_node(node)
{
}
int operator*() const
{
return m_node->value;
}
const Node* operator->() const
{
return m_node;
}
......
}
如果这是主要区别,那么我们也应该处理重复,对吗?
您缺少下面描述的一些内容,class 还不是 "templetized",但方法与标准模板库的 one implementation 使用的方法相同.
- 两个迭代器都需要一个默认构造函数 - 这提供了一种创建空迭代器的方法,您可以稍后对其进行分配
const_iterator
必须可以从iterator
构造 - 添加构造函数到const_iterator
以接受 "regular" 迭代器。
就代码重复而言,这确实是一个公平的观察。但是,大多数实现都适合一行,并且 return 不同的类型,因此尝试在两个模板之间共享实现会使代码更难阅读。