添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

添加或插入新元素

list成员方法:

  • push_front():向 list 容器首个元素前添加新元素;
  • push_back():向 list 容器最后一个元素后添加新元素;
  • emplace_front():在容器首个元素前直接生成新的元素;
  • emplace_back():在容器最后一个元素后直接生成新的元素;
  • emplace():在容器的指定位置直接生成新的元素;
  • insert():在指定位置插入新元素;
  • splice():将其他 list 容器存储的多个元素添加到当前 list 容器的指定位置处。

list.insert() 方法:

insert 使用与 vector、deque相同,详见 vector容器的插入与删除。

list.splice() 方法:

和 insert() 成员方法相比,splice() 成员方法的作用对象是其它 list 容器,其功能是将其它 list 容器中的元素添加到当前 list 容器中指定位置处。

语法格式 功能
void splice (iterator position, list& src); position 为迭代器,用于指明插入位置;src 为另一个 list 容器。
此格式的 splice() 方法的功能是,将 src 容器中存储的所有元素全部移动当前 list 容器中 position 指明的位置处。
void splice (iterator position, list& src, iterator i); position 为迭代器,用于指明插入位置;src 为另一个 list 容器;i 也是一个迭代器,用于指向 src 容器中某个元素。
此格式的 splice() 方法的功能是将 src 容器中 i 指向的元素移动到当前容器中 position 指明的位置处。
void splice (iterator position, list& src, iterator first, iterator last); position 为迭代器,用于指明插入位置;src 为另一个 list 容器;[fist,last) 用于指定 src 容器中的某个区域。
此格式的 splice() 方法的功能是将 src 容器 [first, last) 范围内所有的元素移动到当前容器 position 指明的位置处。

list 容器底层使用的是链表存储结构,详见博客 list的底层实现原理 ,splice() 成员方法移动元素的方式是,将存储该元素的节点从 list 容器底层的链表中摘除,然后再链接到当前 list 容器底层的链表中。这意味着,当使用 splice() 成员方法将 src 容器中的元素添加到当前容器的同时,该元素会从 src 容器中删除。

list<int>sample1{ 1,2,3,4 }, sample2{ 5,6,7 };
	sample1.splice(sample1.begin(), sample2);
	//sample1{5,6,7,1,2,3,4} 
	//sample2{ }
	sample2.splice(sample2.begin(), sample1, sample1.begin());
	//sample1{6,7,1,2,3,4} 
	//sample2{ 5 }
	sample2.splice(sample2.end(), sample1, sample1.begin(), sample1.end());
	//sample1{ } 
	//sample2{5,6,7,1,2,3,4}
 

注意:list容器迭代器为双向迭代器,不支持 p+i 或 p-i 操作,比较时不支持 > 、< 、>= 、<=运算符 ,各类迭代器用法详见迭代器类型

成员函数功能
pop_front()删除位于 list 容器头部的一个元素。
pop_back()删除位于 list 容器尾部的一个元素。
erase()该成员函数既可以删除 list 容器中指定位置处的元素,也可以删除容器中某个区域内的多个元素。
clear()删除 list 容器存储的所有元素。
remove(val)删除容器中所有等于 val 的元素。
unique()删除容器中相邻的重复元素,只保留一份。
remove_if()删除容器中满足条件
  • erase() 和 remove()示例 :
list<char>sample{ 'a','b','c','d','e','f','g' };
	//erase
	sample.erase(--sample.end());
		//sample{'a','b','c','d','e','f'}
	sample.erase(--sample.end(), sample.end());//区间[start,end)
		//sample{'a','b','c','d','e'}
	//remove
	sample.remove('c');
		//sample{'a','b','d','e'}
  • unique() 示例:
//unique
	list<int>sample_int{ 1,2,1,2,3,4,5,5,5 };
	sample_int.unique();
		//sample_int{1,2,1,2,3,4,5}
	//unique与sort连用
	sample_int.sort();
	sample_int.unique();
		//sample_int{1,2,3,4,5}

unique() 函数还可自定义去重规则:

//二元谓词函数:自定义去重规则
bool demo(double first, double second)
	return (int(first) == int(second));
void main()
	list<double> mylist{ 1.1, 1.2, 2.2, 2.3, 3.1, 4.1 };
	mylist.unique(demo);
	 //mylist{1.1, 2.2, 3.1, 4.1}
 

规则可以用Lambda表达式以及函数对象的方式定义,要求返回值为bool型。若相邻两值满足规则,则去除重复值。

  • remove_if() 示例:

通过将自定义的谓词函数(不限定参数个数)传给 remove_if() 成员函数,list 容器中能使谓词函数成立的元素都会被删除。

list<int> mylist{ 15, 16, 7, 17, 19, 9, 8};
	//删除 mylist 容器中能够使 lamba 表达式成立的所有元素。
mylist.remove_if([](int value) {return (value < 10); }); 
	//{15 16 17 19}
                    【STL】list容器插入与删除添加或插入新元素list成员方法:push_front():向 list 容器首个元素前添加新元素;push_back():向 list 容器最后一个元素后添加新元素;emplace_front():在容器首个元素前直接生成新的元素;emplace_back():在容器最后一个元素后直接生成新的元素;emplace():在容器的指定位置直接生成新的元素;insert():在指定位置插入新元素;splice():将其他 list 容器存储的多个元素添加到当前
				
1.关于list容器 list是一种序列式容器list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入删除操作都是快速的。list的实现大概是这样的:list的每个节点有三个域:前驱元素指针域、数据域和后继元素指针域。前驱元素指针域保存了前驱元素的首地址;数据域则是本节点的数据;后继元素指针域则保存了后继元素的首地址。其实,list和循环链表也有相似的地方,即:头节点的前驱元素指针域保存的是链表中尾元素的首地址,list的尾节点的后继元素指针域则保存了头
没有直接根据第几个元素来插入的函数,不过可以这样来插入第n个元素 list<int>::iterator j = a.begin(); for(i = 0; i < n && j!= a.end(); ++i) a.insert(j,5,100); 读任意一个元素也可以用同样方法函数,不过可以这样...
list简介 list 是一个双向链表容器,可高效地进行插入删除元素。 list 不可以随机存取元素,所以不支持 at.(pos)函数与[]操作符。It++(ok) it+5(err) #include list的默认构造 list 采用采用模板类实现,对象的默认构造形式:list<T> lstT; 如: list<int> lstInt; //定义一个存放 int 的 ...
STL——listlist简介list的使用list的构造函数list的迭代器list的capacitylist的元素提取list插入删除 list简介 1、list插入删除的时间复杂度是在常数范围内的序列式容器,并且由于list的底层是用双链表实现的,该容器支持双向迭代。 2、与其他序列式容器相比(array,vector,deque),list在任意位置进行插入删除的效率更高。 3、list最大的缺陷就是不支持任意位置的随机访问。 list的使用 list的构造函数 push_back(elem); //在容器尾部加入一个元素 pop_back(); //删除容器最后一个元素 push_fron(elem); //在容器开头插入一个元素 pop_front(); //从容器中移除第一个容器 insert(pos, elem); //在pos位置插入elem元素的拷贝,返回新数据的位置。 insert(pos, n, elem)
C++中的STL(Standard Template Library)是一组通用的模板类和函数,它们可用于实现许多常用的数据结构和算法,其中包括许多容器类。下面是STL中常见的容器类: 1. vector:向量容器,用于存储动态大小的元素序列,支持快速随机访问和尾部插入/删除操作。 2. list:链表容器,用于存储动态大小的元素序列,支持快速插入/删除操作,但不支持随机访问。 3. deque:双端队列容器,用于存储动态大小的元素序列,支持快速随机访问和头部/尾部插入/删除操作。 4. set/multiset:集合容器,用于存储一组不重复的元素,支持快速查找、插入删除操作。multiset允许重复元素。 5. map/multimap:映射容器,用于存储一个键值对的集合,支持快速查找、插入删除操作。multimap允许键重复。 6. stack:栈容器,用于存储一组元素,支持在末尾插入删除元素,遵循先进后出(LIFO)的原则。 7. queue:队列容器,用于存储一组元素,支持在末尾插入和头部删除元素,遵循先进先出(FIFO)的原则。 8. priority_queue:优先队列容器,用于存储一组元素,支持在末尾插入和弹出元素,但弹出的元素总是具有最高优先级。 这些容器类都是模板类,因此可以存储不同类型的数据。它们提供了许多有用的成员函数和迭代器,可以方便地操作元素序列。