use*_*910 3 c++ iterator linked-list list stdlist
我编写了自己的容器类,其原始内部数据结构是std::list
.然后我需要创建自己的双向链表.我现在已经实现了我自己的双向链表以及链接列表的自己的迭代器,但是我遇到了问题std::list
,特别是begin()
和end()
.
根据我的理解,begin()
应该指向第一个节点,并且end()
应该将一个元素指向最后一个元素.我需要确保当我调用时end()
,我可以减少回到有效的最后一个元素.我还需要确保我可以做正常的遍历,比如......
while (beg != end ) { do something; beg++; }
Run Code Online (Sandbox Code Playgroud)
本质上,我的链表只使用包含数据元素的节点,指向前一节点的指针和指向下一个节点的指针.
当我第一次尝试实现我的时候end()
,我只有最后一个节点的下一个指针是a nullptr
.它可以单独工作,但不会像stl一样工作.
关于如何实现的任何意见begin()
和end()
标准库做同样的方式?
小智 5
您可以引入一个标记节点并具有循环链表.
草图:
class List
{
private:
struct Node {
Node* previous;
Node* next;
Node() : previous(this), next(this) {}
};
struct DataNode : Node {
int data;
};
public:
class iterator
{
friend class List;
private:
iterator(Node* node) : m_node(node) {}
public:
iterator() : m_node(0) {}
iterator& operator ++() {
m_node = m_node->next;
return *this;
}
int& operator * () {
// Note: Dereferncing the end (sentinal node) is undefined behavior.
return reinterpret_cast<DataNode*>(m_node)->data;
}
// More iterator functions.
private:
Node* m_node;
};
public:
List() : m_sentinal(new Node) {}
iterator begin() { return iterator(m_sentinal->next); }
iterator end() { return iterator(m_sentinal); }
iterator insert(iterator position, int data) {
DataNode* data_node = new DataNode; // pass data
Node* current = position.m_node;
data_node->next = current;
data_node->previous = current->previous;
current->previous->next = data_node;
current->previous = data_node;
return iterator(current);
}
void append(int data) {
insert(end(), data);
}
private:
Node* m_sentinal;
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9532 次 |
最近记录: |