首页 > 其他分享 >list

list

时间:2024-05-15 19:57:43浏览次数:14  
标签:node __ 迭代 iterator list 节点

文档链接

list与vector

list

  • 优点
    • list头部、中间插入不再需要挪动数据
    • 插入数据是新增节点,不需要增容
  • 缺点
    • 不支持随机访问

vector

  • 优点
    • 支持下标的随机访问,间接的就很好的支持排序、二分查找、堆算法等
  • 缺点
    • 头部和中间插入删除效率低
    • 插入数据时空间不够需要增容,代价大

list的本质

list的本质实际上就是一个带头双向循环链表

list() {
	_head = new Node;
	_head->_next = _head;
	_head->_prev = _head;
}

节点

list节点存放的是上一个节点的指针、下一个节点的指针、数据。

	template <class T>
	struct __list_node {//节点的封装
		__list_node<T>* _next;
		__list_node<T>* _prev;
		T _data;

		__list_node(const T& x = T())//new 一个节点时,对节点的初始化
			:_next(nullptr)
			,_prev(nullptr)
			,_data(x) {}
	};

迭代器

list的迭代器和string与vector的有所不同,string和vector的迭代器是一个原生指针,而list的迭代器则是一个自定义的类型,里面封装了一个节点的指针以及有关迭代器的一系列操作

	template <class T>
	struct __list_iterator {//list的迭代器实际上是一个指向节点的指针
		typedef __list_node<T> Node;
		Node* _node;

		__list_iterator(Node* node)
			:_node(node) {}

		// *it
		T& operator*() {
			return _node->_data;
		}

		//前置++
		__list_iterator<T>& operator++() {

			_node = _node->_next;
			return *this;
		}

		//前置--
		__list_iterator<T>& operator--() {
			_node = _node->_prev;
			return *this;
		}

		//后置++
		__list_iterator<T> operator++(int) {
			__list_iterator<T> temp(*this);
			_node = _node->_next;
			return temp;
		}

		//后置--
		__list_iterator<T> operator--(int) {
			__list_iterator<T> temp(*this);
			_node = _node->_prev;
			return temp;
		}

		//==
		bool operator==(const __list_iterator<T>& it) {
			return _node == it._node;
		}

		//!=
		bool operator!=(const __list_iterator<T>& it) {
			return _node != it._node;
		}

		//->
		T* operator->() {
			return &_node->_data;
		}
	};

迭代器失效

在list中,插入数据的操作是不会导致迭代器失效的,因为迭代器保存的是节点的指针,插入新数据的时候,已有的内存地址并不会改变。

删除数据则会导致迭代器失效,删除节点后,原本指向的节点已经被释放,此时迭代器变成了空指针,继续访问则会导致出错。

标签:node,__,迭代,iterator,list,节点
From: https://www.cnblogs.com/zhiheng-/p/18194597

相关文章

  • ArrayList和LinkedList区别
    底层数据结构ArrayList是动态数组的数据结构实现。LinkedList是双向链表的数据结构实现。效率下标査询ArrayList按照下标査询的时间复杂度O(1)。LinkedList不支持下标查询。查找(未知索引)ArrayList需要遍历,链表也需要链表,时间复杂度都是O(n)。新增和删除ArrayL......
  • Java把List集合转成树形结构
     代码如下:privatestatic<T,K>List<T>listToTree(List<T>list,Predicate<T>isTop,Function<?superT,?extendsK>getId,Function<?superT,?extendsK>getParentId,BiConsumer<T,List<T>>setChilds){......
  • Spring源码分析:List集合注入
    pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://ma......
  • 数组和List互转
    数组转List数组转List,使用JDK中java.util.Arrays工具类的asList方法。importjava.util.Arrays;importjava.util.List;publicclassMain{publicstaticvoidmain(String[]args){String[]strs={"aaa","bbb","ccc"};List......
  • 【java】【集合类】ArrayList扩容机制
    扩容规则1.ArrayList()无参构造扩容2.ArrayList(intinitialCapacity)扩容3.publicArrayList(Collection<?extendsE>c)扩容4.add(Objecto)扩容5.addAll(Collectionc)扩容要注意的是,以下所有代码中用反射方式来更直观地反映ArrayList的扩容特征,但从JDK9由于模......
  • repeater中嵌套放入RadioButtonList
    <asp:RepeaterID="rptList"runat="server"onitemdatabound="rptList_ItemDataBound"><HeaderTemplate><tablewidth="100%"border="0"cellspacing="0"cellpadding="0"......
  • 超简洁的todolist工具,电脑桌面高效计划管理软件
    对于上班族来说,在电脑上使用一款高效计划管理软件至关重要。这样的工具不仅能帮助我们清晰地规划和追踪工作任务,还能有效提高工作效率,减少遗漏和延误。例如,当我们面临多个项目并行时,通过管理软件可以一目了然地查看各项任务的进度和优先级,从而合理分配时间和精力。那么,哪款电脑桌......
  • checkboxlist绑定数据方法
    checkboxlist绑定数据方法1.把数据绑定到CheckBoxList中特别要注意加载顺序protectedvoidPage_Load(objectsender,EventArgse){if(!Page.IsPostBack){SqlConnectioncon=GetDBCon.GetCon();......
  • 1250 - Table 'd' from one of the SELECTs cannot be used in field list
    1问题描述sql数据库查询接口union后orderby某字段,提示错误“1250-Table'd'fromoneoftheSELECTscannotbeusedinfieldlist“。移除orderby条件,就不会报错,但是不满足按照某个字段排序。 2方案解决修改排序条件为:orderbystatId即可。(union后的结果是字段......
  • cmakelist的一个例子
    一个例子,仅做参考用: CMAKE_MINIMUM_REQUIRED(VERSION3.12)set(ProjName"NetworkTest")project(${ProjName})string(FIND${CMAKE_CURRENT_BINARY_DIR}"/"pos0REVERSE)MATH(EXPRpos0${pos0}+1)string(SUBSTRING${CMAKE_CURRENT_BINARY_DIR}${po......