C++---list(列表)模板

list介绍
list模板类也是一个容器。list是由双向链表实现,每个节点存储一个元素。list支持前后两种移动方向。
list优势在于可以在任何位置上进行插入、删除,同时也可以双向迭代。

list与vector的区别

  • list不支持随机访问
  • list没有下标访问符[]和at()函数
  • list没有提供容量,空间操作的函数,每个元素都有自己的内存。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
  • list的插入、删除不会影响迭代器的失效

list构造函数

list()构造空的 list
list(size)创建大小为 size 的对象
list(size , value)创建大小为 size 的对象,每个元素的初始值都为 value
list(const list& l)拷贝构造
list(first , end)用[first , end)区间的元素创建 list

元素的赋值

push_front()在容器的头部插入新的元素
push_back()在容器的尾部插入新的元素
pop_front()删除头元素
pop_back()删除尾元素
//函数原型
void push_front(const T& x);
void push_back(const T& x);
void pop_front();
void pop_back();

容器的容量
resize()、size()、max_size()作用于vector容器中的作用类似。
max_size()为容器最大

特殊函数
merge(),将2个list对象合并成文一个list对象,合并后的容器中的元素是按照升序排列。
sort(),用于list类型容器中的元素进行排序,默认的排序方式为从小到大。

void sort();
void sort(greater<T> x);//从大到小排序

remove(),不需要指定位置,只需要告诉删除元素的值,就可以直接删除相应的元素。
unique(),移除相邻重复的元素

l1.unique();  //删除相邻重复的元素
l2.unique(Pred);//仅保留与第一个元素相等的元素

如果用unique()函数,删除重复的元素时,应该先给对象进行排序。

reverse(),翻转字符串

#include<iostream>

using namespace std;

namespace Bai
{
	template<class T>
	class ListNode
	{
	public:
		ListNode(const T& value = T())
			:val (value)
			,_pnext(nullptr)
			,_prev(nullptr)
		{}
		T val;
		ListNode<T>* _pnext;
		ListNode<T>* _prev;
	};

	template<class T,class Ref,class Ptr>
	class ListIterator
	{
	public:
		typedef ListNode<T>* PNode;
		typedef ListIterator<T, Ref, Ptr>Self;
		PNode _node;

		ListIterator(PNode node)
			:_node(node)
		{}

		Ref operator*()
		{
			return _node->val;
		}

		Ptr operator->()
		{
			return &(_node->val);
		}

		Self& operator++()
		{
			_node = _node->_pnext;
			return *this;
		}

		Self operator++(int)
		{
			Self temp(*this);
			_node = _node->_pnext;
			return temp;
		}

		Self operator--()
		{
			_node = _node->_prev;
			return *this;
		}

		Self operator--(int)
		{
			Self temp(*this);
			_node = _node->_prev;
			return temp;
		}

		bool operator!=(const Self& x)
		{
			return _node != x._node;
		}

		bool operator==(const Self& x)
		{
			return _node == x._node;
		}

	};

	template<class T>
	class List
	{
	public:
		typedef ListNode<T> Node;
		typedef Node* PNode;
		typedef ListIterator<T, T&, T*> iterator;
		List()
		{
			_head = new Node;
			_head->_pnext = _head;
			_head->_prev = _head;
		}

		List(int n, const T& val = T())
		{
			_head = new Node;
			_head->_pnext = _head;
			_head->_prev = _head;

			for (int i = 0; i < n; ++i)
			{
				PushBack(val);
			}
		}
		template<class Iterator>
		List(Iterator first, Iterator last)
		{
			_head = new Node;
			_head->_pnext = _head;
			_head->_prev = _head;
			while (first != last)
			{
				PushBack(*first);
				first++;
			}
		}

		List(const List<T>& x)
		{
			_head = new Node;
			_head->_pnext = _head;
			_head->_prev = _head;

			List<T> temp(x.begin(), x.end());
			swap(_head, temp);
		}

		List<T>& operator=(List<T> x)
		{
			swap(_head, x._head);
			return *this;
		}

		~List()
		{
			if (_head)
			{
				PNode pcur = _head->_pnext;
				while (pcur != _head)
				{
					PNode next = pcur->_pnext;
					delete pcur;
					pcur = next;
				}
				delete _head;
				_head = nullptr;
			}
		}

		iterator begin()
		{
			return iterator(_head->_pnext);
		}

		iterator end()
		{
			return iterator(_head);
		}

		T& Front()
		{
			return _head->_pnext->val;
		}

		const T& Front()const
		{
			return _head->_pnext->val;
		}

		T& Back()
		{
			return _head->_prev->val;
		}

		void PushBack(const T& val)
		{
			PNode NewNode = new Node(val);
			PNode prev = _head->_prev;
			prev->_pnext = NewNode;
			NewNode->_prev = prev;
			NewNode->_pnext = _head;
			_head->_prev = NewNode;
		}

		void PopBack()
		{
			PNode del = _head->_prev;
			if (del != _head)
			{
				_head->_prev = del->_prev;
				del->_prev->_pnext = _head;
				delete del;
			}
		}

		void PushFront(const T& val)
		{
			PNode NewNode = new Node(val);
			NewNode->_prev = _head;
			NewNode->_pnext = _head->_pnext;
			_head->_pnext->_prev = NewNode;
			_head->_pnext = NewNode;
		}

		void PopFront()
		{
			PNode cur = _head->_pnext;
			if (cur != _head)
			{
				_head->_pnext = cur->_pnext;
				cur->_pnext->_prev = _head;
				delete cur;
			}	
		}
		//在pos位置前插入val
		iterator Insert(iterator pos, const T& val)
		{
			PNode NewNode = new Node(val);
			PNode pCur = pos._node;
			NewNode->_pnext = pCur;
			NewNode->_prev = pCur->_prev;
			NewNode->_prev->_pnext = NewNode;
			pCur->_prev = NewNode;
		}

		iterator Erase(iterator pos)
		{
			PNode pCur = pos._node;
			PNode prev = pCur->_prev;
			PNode next = pCur->_pnext;
			if (pCur != _head)
			{
				prev->_pnext = next;
				next->_prev = pre;
				delete pCur;
				pCur = nullptr;
				pos = iterator(next);
			}
			return next;
		}
		void Clear()
		{
			PNode cur = _head->_pnext;
			while (cur != _head)
			{
				PNode temp = cur->_pnext;
				delete cur;
				cur = temp;
			}
			_head->_pnext = _head;
			_head->_prev = _head;
		}

		size_t Size()
		{
			size_t size;
			PNode cur = _head->_pnext;
			while (cur != _head)
			{
				size++;
				cur = cur->_pnext;
			}
			return size;
		}

		bool Empty()const
		{
			return _head->_pnext == _head;
		}

		void Resize(size_t size, const T& val = T())
		{
			size_t Oldsize = Size();
			if (Oldsize <= size)
			{
				for (size_t i = Oldsize; i < size; ++i)
					PushBack(val);
			}
			else
			{
				for (size_t i = size; i > Oldsize; --i)
					PopBack();
			}
		}

		
	private:
		PNode _head;
	};
}

template<class T>
void PrintList(Bai::List<T>& x)
{
	auto it = x.begin();
	while (it != x.end())
	{
		cout << *it << " ";
		it++;
	}
}
int main()
{
	int array[] = { 1,2,3,4,5,6,7,8,9 };
	Bai::List<int> L(array, array + sizeof(array) / sizeof(array[0]));
	PrintList(L);
	system("pause");
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STL是指标准模板库(Standard Template Library),它是C++语言的一部分,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的目标是提供高效、可重用和可扩展的组件,以便开发人员能够更轻松地编写高质量的代码。STL包含了许多常见的数据结构,如vector、list、set、map等,以及各种算法,比如排序、查找、遍历等。通过使用STL,开发人员可以更加高效地处理各种数据结构和算法的问题,提高代码的开发效率和质量。 在STL中,我们可以使用各种容器来存储和管理数据。例如,我们可以使用std::map来创建一个键值对的映射,其中每个键都有一个与之相关联的值。下面是一个示例代码,展示了如何创建和使用一个std::map对象: std::map<std::string, int> disMap() { std::map<std::string, int> tempMap{ {"C语言教程",10},{"STL教程",20} }; return tempMap; } std::map<std::string, int> newMap(disMap()); 在这个示例中,disMap()函数创建了一个临时的std::map对象,并初始化了其中的一些键值对。然后,使用移动构造函数将这个临时对象移动到了一个新的std::map对象newMap中。最终,我们可以通过newMap对象来访问和操作这些键值对。 综上所述,STL是C++中的标准模板库,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的使用可以提高代码的开发效率和质量,并且通过各种容器和算法,可以方便地处理各种数据结构和算法的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STL详解超全总结(快速入门STL)](https://blog.csdn.net/qq_50285142/article/details/114026148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【C++实验】阅读STL源码并分析](https://blog.csdn.net/qq_35760825/article/details/125311509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值