C++ STL之list

1. 定义
不连续的内存,通过指针连接起来的内存(双向链表)
2. 基本用法

//头文件
	#include <list>
	using namespace std;
//初始化
	void InitList()
	{
   			list<int> lst; //初始化一个空的
    		list<int> lst1(10); // 初始化一个包括10个元素的,且10个元素值都是0
   			list<int> lst2(10, 55); // 初始化一个包括10个原始,且10个元素值都是55
    		list<int> lst3(lst1); // 使用一个list来初始化,创建了一个副本
   			list<int> lst4(++lst2.begin(),--lst2.end()); // 使用一个list的部分元素来初始化
	}
//插入数据
	template <class T>
	list<T> InsertList(list<T> lst, T t)
	{
   	 	lst.push_back(t);      // 插入到列表末端		
   		t = 10;
   		lst.push_front(t);     // 插入到列表的最前端
    	lst.assign(10, t);     // 放入10个相同的元素(会清除掉之前存入的所有数据)
		T arr[10] = {1,2,3,4,5,6,7,8,9,0};
   		lst.assign(arr, arr + 10);          // 将数组数据放入list(会清除掉之前存入的数据)
   		list<T> lst1(10, 15);
   		lst.insert(lst.begin(), lst1.begin(), lst1.end());      // 在指定位置,插入另一个list的部分元素
   		lst.insert(lst.end(), 5, 20);       // 在指定位置,插入5个元素,值均为20
   		lst.insert(--lst.end(), 25);        // 在指定位置,直接插入值为25的元素
  		return lst;
	}
//遍历数据
	void IteratorList(list<int> lst)
	{
    		if (lst.empty()) // 判断列表是否为空
        	return;	
    		list<int>::iterator iter = lst.begin(); // 前向迭代器
    		for (; iter != lst.end(); iter++)
    		{
        		cout << "iter value: " << *iter << endl;
    		}
    		list<int>::reverse_iterator revIter = lst.rbegin(); // 方向迭代器
    		for (; revIter != lst.rend(); revIter++)
    		{
        		cout << "revIter value: " << *revIter << endl;
    		}
    		list<int>::const_iterator constIter = lst.cbegin();
    		for (; constIter != lst.cend(); constIter++)
    		{
        		cout << "constIter value: " << *constIter << endl;
    		}
	}
//删除数据
	void DeleteList(list<int>& lst)
	{
    		if (lst.empty())
        	return;
    		lst.pop_back(); // 删除末尾的元素
    		lst.pop_front(); // 删除第一个元素
    		lst.erase(lst.begin(), ++lst.begin()); // 删除指定范围的元素(使用迭代器来确定需要被删除的元素),区间[ )
    		lst.erase(--lst.end()); // 删除指定迭代器指向的元素
    		lst.remove(20); // 删除指定值的元素,若多个元素值相同,则多个元素均会被删除(通过数值的方式来确定被删除元素,且删除所有与 				val 值相等的元素)
    		lst.unique(); // 删除list中重复的数据,即去重,会保留一个元素
    		lst.clear(); // 清除掉所有数据
	}
//排序数据
	int arr[10] = {3,2,1,4,6,5,9,7,8,0};
	lst.assign(arr, arr + 10); // 将数组数据放入list(会清除掉之前存入的数据)

	lst.sort(); // 按从小到大排序
	list<int>::iterator iter = lst.begin();
	for (; iter != lst.end(); iter++)
	{
    		cout << "iter value: " << *iter << endl; // 分别输出:0 1 2 3 4 5 6 7 8 9 
	}

	lst.reverse(); // 按从大到小排序,即倒序
	iter = lst.begin(); 
	for (; iter != lst.end(); iter++)
	{
    		cout << "iter value: " << *iter << endl; // 分别输出:9 8 7 6 5 4 3 2 1 0
	}
//合并数据
	list<int> lst1(10, 33); // 10个元素,值均为33
	list<int> lst2(10, 44); // 10个元素,值均为44
	list<int> lst3(10, 55); // 10个元素,值均为55
	// 合并方式一
	lst1.merge(lst2); // 合并元素后,lst2被清空,在lst1的末端添加lst2的元素。即将lst2中元素移到lst1中
	// 合并方式二
	lst1.splice(lst1.begin(), lst3, lst3.begin(), --lst3.end()); // 在指定位置,将lst3中的指定范围元素移到lst1中,lst3中对应元素被清	除,区间范围:[ }
	lst1.splice(lst1.end(), lst3, lst3.begin()); // 在指定位置,将lst3中指定元素移到lst1中,同时从lst3中清除该元素
	lst1.splice(lst1.end(), lst3); // 在指定位置,将lst3中所有元素移至lst1中,并清空lst3
//交换数据
	list<int> lst1(10, 33); // 10个元素,值均为33
	list<int> lst2(10, 44); // 10个元素,值均为44
	lst1.swap(lst2); // 二个list相互交互所有元素
//获取首位数据
	list<int> lst;
	int arr[10] = {3,2,1,4,6,5,9,7,8,0};
	lst.assign(arr, arr + 10); 
	// 获取最后一个和第一个元素的值
	cout << "back value:" << lst.back() << "front value:" << lst.front() << endl; // 输出 back value:0  front value:3
	cout << ++lst.back() << "\t" << ++lst.front() << endl;  // 输出 1    4,同时list中对应元素也变成了1和4

3. 易错难点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值