[STL]:模拟实现List

本文介绍了STL中的List容器,包括其作为双向链表的特点、插入与删除操作,强调了迭代器的使用及失效问题。还详细探讨了List的底层实现原理,模拟构造过程,以及插入和删除的具体步骤,同时提到了迭代器实现的复杂性。
摘要由CSDN通过智能技术生成

1.List的介绍及使用接口

1.1 List是什么

List是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代,List的底层是双向链表结构。

1.2 iterator的使用

如下demo,我们分别用正向迭代器和反向迭代器访问List元素

int main()
{
   
	int array[] = {
    1,2,3,4 };
	list<int>l1(array, array + sizeof(array) / sizeof(array[0]));
	list<int>::iterator it = l1.begin();
	//正向1234
	while (it != l1.end())
	{
   
		cout << *it << " ";
		it++;
	}
	//逆向4321
	list<int>::reverse_iterator it2 = l1.rbegin();
	while (it2 != l1.rend())
	{
   
		cout << *it2 << " ";
		it2++;
	}
	system("pause");
	return 0;
}

1.2 List的插入与删除

<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给您讲解一下如何模拟STLlist类。 List是一个双向链表,我们可以通过自己实现节点类和链表类来模拟这个数据结构。 首先,我们需要定义一个节点类,包含前驱节点指针、后继节点指针、以及存储数据的成员变量。代码如下: ``` template <typename T> class ListNode { public: T data; ListNode* prev; ListNode* next; ListNode(T data) : data(data), prev(nullptr), next(nullptr) {} }; ``` 接着,我们定义链表类,包含头节点指针和尾节点指针,以及一些常用的操作方法,如插入、删除、查找等。代码如下: ``` template <typename T> class List { public: List() : head(nullptr), tail(nullptr), size(0) {} ~List() { clear(); } void insert(T data) { ListNode<T>* node = new ListNode<T>(data); if (head == nullptr) { head = node; tail = node; } else { tail->next = node; node->prev = tail; tail = node; } size++; } void remove(T data) { ListNode<T>* node = head; while (node != nullptr) { if (node->data == data) { if (node == head) { head = node->next; if (head != nullptr) { head->prev = nullptr; } } else if (node == tail) { tail = node->prev; if (tail != nullptr) { tail->next = nullptr; } } else { node->prev->next = node->next; node->next->prev = node->prev; } delete node; size--; return; } node = node->next; } } ListNode<T>* find(T data) { ListNode<T>* node = head; while (node != nullptr) { if (node->data == data) { return node; } node = node->next; } return nullptr; } void clear() { ListNode<T>* node = head; while (node != nullptr) { ListNode<T>* next = node->next; delete node; node = next; } head = nullptr; tail = nullptr; size = 0; } int getSize() const { return size; } private: ListNode<T>* head; ListNode<T>* tail; int size; }; ``` 这样,我们就实现了一个简单的模拟STLlist类。您可以通过调用insert、remove、find等方法来操作链表中的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值