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. 易错难点

STM32F103是意法半导体(STMicroelectronics)推出的一款基于ARM Cortex-M3内核的微控制器,广泛应用于工业控制、物联网设备等领域。本资料包主要提供了STM32F103在实现RS485通信及Modbus RTU协议的主机和从机模式下的源代码实例,帮助开发者快速理解和应用这一通讯技术。 RS485是一种物理层通信标准,用于构建多点数据通信网络,具有传输距离远、抗干扰能力强的特点。它采用差分信号传输方式,可以实现双向通信,适合于长距离的工业环境。在RS485网络中,通常有一个主机(Master)和一个或多个从机(Slave),主机负责发起通信,从机响应主机的请求。 Modbus RTU(Remote Terminal Unit)是一种常用的过程控制工业通信协议,基于ASCII或RTU(远程终端单元)报文格式,常用于PLC(可编程逻辑控制器)和嵌入式系统之间的通信。Modbus RTU使用串行通信接口,如RS485,以减少布线成本和提高通信效率。 在STM32F103上实现RS485 Modbus RTU通信,首先需要配置GPIO口作为RS485的硬件接口,包括数据线(一般为RX和TX)和方向控制线(DE和RE)。DE线用于控制发送数据时的数据线方向,RE线则用于接收数据时的方向。这些设置可以通过STM32的HAL库或LL库进行编程。 接着,你需要编写Modbus RTU协议栈的实现,这包括解析和构造Modbus报文、错误检测与处理、超时管理等。Modbus RTU报文由功能码、地址、数据和CRC校验码组成。主机向从机发送请求报文,从机会根据接收到的功能码执行相应的操作,并返回响应报文。 在主机端,你需要实现发送请求和接收响应的函数,以及解析从机返回的数据。在从机端,你需要监听串口,解析接收到的请求,执行相应的功能并构造响应报文。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值