gpt4 book ai didi

c++ - 为双向链表实现 begin() 和 end()

转载 作者:太空狗 更新时间:2023-10-29 20:13:22 25 4
gpt4 key购买 nike

我已经编写了自己的容器类,其原始内部数据结构是 std::list。然后我需要创建自己的双向链表。我现在已经实现了我自己的双向链表以及我自己的链表迭代器,但我在让它表现得像 std::list 时遇到问题,尤其是 begin( )end()

据我了解,begin() 应该指向第一个节点,end() 应该指向最后一个元素之后的一个元素。我需要确保在调用 end() 时我可以递减到有效的最后一个元素。我还需要确保我可以进行正常的遍历,例如...

while (beg != end ) { do something; beg++; }

本质上,我的链表只使用包含数据元素的节点、指向前一个节点的指针和指向下一个节点的指针。

当我第一次尝试实现我的end() 时,我只是让最后一个节点的下一个指针成为一个nullptr。它独立工作,但与 STL 的工作方式不同。

关于如何以与标准库相同的方式实现 begin()end() 有什么建议吗?

最佳答案

您可以引入一个哨兵节点并拥有一个循环链表。

草图:

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;
};

关于c++ - 为双向链表实现 begin() 和 end(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21860674/

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