STL -容器 <stack> <queue> <list>相关API及原理
链表容器原理:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,节点可以在运行时动态生成。每个节点包括两个部分:一个是存储数据元素的数据域,一个是存储下一个节点地址的指针域。
相较于vector的连续线性空间,list就显得负责的多,它的好处是每次插入或者删除元素的时间复杂度为O(1)。但是在内存空间上面由于是散列分布的,所以空间利用率并没有vector来的高。
迭代器(不支持随机访问,仅限递增或者递减)List容器不能像vector一样以普通指针作为迭代器,因为其节点不能保证在同一块连续的内存空间上。List迭代器必须有能力指向list的节点,并有能力进行正确的递增、递减、取值、成员存取操作。所谓list正确的递增、递减、取值、成员取用是指:递增时指向下一个节点,递减指向上一个节点,取值时取的是节点的数据值,成员取用时取的是节点的成员。
由于list是一个双向链表,迭代器必须能够具备前移、后移的能力,所以list容器提供的是Bidirectional Iterators
List有一个重要的性质,插入操作和删除 ...
STL -容器 <deque> 相关API及原理
Deque容器(双端队列)Deque是一种双向开口的连续线性空间。
Deque容器和vector最大的差异是:一再与deque头端的插入删除是O(1)时间复杂度。二是deque没有容量的概念,因为它是动态的分段连续空间组合而成,随时可以增加一段新的空间并链接起来。反观vector容器的空间不足时需要重新配置一块更大的空间然后复制元素,再释旧空间。因此,deque没有必要提供所谓的空间保留reserver功能
虽然deque容器也提供了可以随机访问的迭代器,但是它的迭代器并不是普通的指针,其复杂度和vector不是一个量级,这当然影响各个运算的层面。因此,除非必要,我们应该尽可能使用vector而不是deque.对deque的排序操作,为了最高效率,可以将deque先完整复制到一个vector中,对vector进行排序再复制回deque。
Deque容器是连续的空间,至少逻辑上看是如此,连续线性空间总是令我们联想到array和vector。array无法成长,vector虽然可以成长但是只能向尾端成长,而且其成长是一个假象,事实上是:申请更大的空间 ->原数据复制到新空间-> ...
STL -容器 <vector> 相关API及原理
Vector(序列容器)Vector维护一个线性空间,单向开口的连续内存空间(开口在尾部),所谓动态增长并不是在原有空间上接续新空间(因为无法保证
原有空间之后尚有可配置的空间),而是一块更大的内存空间 然后将原数据拷贝到新空间中,并释放原空间。因此,对vector的任
何操作,一旦引起空间的重新配置,指向原vector的所有迭代器都会失效
迭代器Vector迭代器是随机访问的迭代器,支持跳跃访问
Insert/erase/ (迭代器)逆序迭代器 reverse_iterator .
例如:for(vector::reverse_iterator it=v.rbegin();it!=rend();it++)
构造函数
vector<T> v 默认构造函数
vectoor(v.begin(),v.end()) //将v.begin()到end()区间中的元素拷贝给本身
vector(n,T) 构造函数将n个T拷贝给本身
vector(const vector &vec) 拷贝构造函数
常用赋值操作
assign(beg,end); 将(beg,end)区间的数据 ...
STL -容器 <string> 相关API及原理
API构造函数string() 创建一个空的字符串
string(const string &str) 使用一个string对象初始化
string(const char *s) 使用字符串s初始化
string(int n,char c) 使用n个字符c初始化
基本赋值操作string &operator=(const char *s)
string &operator=(const string &s)
string &operator=(char c)
string &assign(const char *s) 把字符串赋值给当前字符串
string &assign(int n,char c) 把n个字符c赋值给当前字符串
string &assign(const string &s,int start,int n ); 将s从start开始n个字符赋值给字符串
拼接操作string &operator+=(const string &str)
string &op ...
STL- 总览
STL组成
容器 :存放数据 类似于class template
迭代器 :迭代器是一种将operator *,operator-> , operator ++,operator –等指针相关操作重载的class template。每个STL容器都附带有自己专属的迭代器(意味着如果容器中的元素为自己声明的类型时需要自己设计一个迭代器),只有容器的设计者才知道如何遍历自己的元素
算法:类似于function template
仿函数 :行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class或者class template
适配器(配接器):一种用来修饰容器或者仿函数或迭代器接口的东西
空间配置器:负责空间的配置与管理。从实现的角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class template
关系容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。
几个容器区别和使用场景
算法复习-动态规划(5)
LeetCode 139 单词拆分给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
注意你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
来源:力扣(LeetCode)链接:https: ...
算法复习-动态规划(4)
LeetCode No.188 股票给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [2,4,1], k = 2
输出: 2
解释: 在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
示例 2:
输入: [3,2,6,5,0,3], k = 2
输出: 7
解释: 在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/best-time ...
算法复习-动态规划(3)
LeetCode No.120 三角形最小路径和给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/triangle著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
回溯法走路(i,j){
min(走路(i+1,j),走路(i+1,j+1))
}
贪心法如果只看当前层,那么后面层的时候如果有过大的话就没办法了例如[
[2],
[3,4],
[6,5,7],
[4,1=>1000,8=>80 ...
算法复习-动态规划(2)
改说的概念什么的都在前面讲完了,剩下的都是实例分析了
LeetCode No.70 爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2输出: 2解释: 有两种方法可以爬到楼顶。
1 阶 + 1 阶
2 阶示例 2:
输入: 3输出: 3解释: 有三种方法可以爬到楼顶。
1 阶 + 1 阶 + 1 阶
1 阶 + 2 阶
2 阶 + 1 阶
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/climbing-stairs著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
回溯(自顶向下的去看)从终点开始看,向下看:fun(n),fun(n-1)….fun(1)观察第n阶台阶可以从哪些台阶上来。fun(n)=fun(n-1)+fun(n-2)就是斐波拉契数列
动态规划for i=2->nf[n]=f[n-1]+f[n-2]dp状态定义:f[n]表示 ...
又是折腾的一天
折腾了半天的QT 最后重新安装了QT5.12,比QT4.8香多了前置服务器的日志系统基本上是装完了,后置服务器需要再弄一弄不过接下来就是得准备计算机网络基础的考试和数据库了都不会23333
Log4cplus 介绍及使用
一、基本的类
类
功能
Logger
记录日志的句柄。
Appender
用于指定内容输出位置(如:控制台,文件、远程服务器等)。一个Logger可添加多个Appender,从而向多个位置输出日志。
Layout
用于指定日志输出的格式。每个Appender需要设置一个Layout。
Logger —— Appender —— Layout的关系图:
二、Log4cplus支持的Appender的类型
上图是Appender的继承关系,其中Log4cplus::Appnder是各种Appender的父类。从图中,我们可以获得log4cplus所支持的Appender的类型。
三、Log4cplus支持的Layout的类型
上图是Layout的继承关系,其中Log4cplus::Layout是各种Layout的父类。从图中,我们可以得知Layout的类型有3种,分别为PatternLayout、SimpleLayout和TTCCLayout。其中的PatternLayout可以让用户自定义输出格式。
四、Log4cplus的基本使用 ...
上位机 开发日志 2019-12-10
知识点丢包、重包、粘包的处理日志系统你信号量
问题&&BUG
下位机修改过了,发送数据丢包率增加了,导致信号量释放过多发生异常。大部分异常出现在开始测试的时候,因为需要先移动到对应位置才能开始扫描(移动到对应位置的命令就是开始测试),在接收这个应答的处理函数中会发送一个开始测试的信号量(提供给外部能够判断是否移动结束),但是在孵化结束的时候开始采集同时也需要开始测试协议,导致信号量实际释放得比原来的多。(实际表现在前一个卡正常测试,后一个卡会动一下就结束采集,以此类推)。
从sd卡中获得数据的时候会有错误(小概率事件),导致生成的sd卡文件为空,进而导致调用dll函数时出错。
自检和满卡的时候没有屏蔽操作
sd卡检测线程无法检测到sd卡拔出操作
线程中的弹框无法暂停主线程的运行
程序中很多多余的标志位
解决方案及过程
在所有信号量释放的时候增加异常处理操作。
增加当sd卡插入获取数据时有错误时禁止覆盖原sd卡文件
在屏蔽操作中增加一个检测是否满卡的操作,当满卡的时候默认为屏蔽操作。
在检测线程中发送sd卡检测命令,同时增加一个SDisNew标志位,便于判断当前的sd卡 ...