OpenSSL是常用的一个加密库或者说SSL实现库,常用在Linux下进行编译使用,但是在windows中也有使用的需求
在windows下进行编译安装之后,可以使用OpenSSL库,但是在对代码进行调试的时候只能在OpenSSL给出的函数外部进行调试,无法进入到函数内部。本文便是给出windows环境下OpenSSL1.1.1的编译与调试
编译安装OpenSSL
常用排序算法及实现
排序算法
天下排序算法千千万,归根结底思想是不变的,让我们从头开始看看排序算法及实现
选择排序
选择排序的思想
选出数组中最小的元素,将其与第一个元素交换。然后找出次小的元素与第二个元素交换,一直进行下去,直到数组排完。选择排序是一种原址排序
时间复杂度: 平均情况 \(O(N^2)\),最坏情况\(O(N^2)\),最好情况 \(O(N^2)\)
空间复杂度:\(O(1)\)
稳定性:不稳定
实现:
数据结构学习<五> 树的性质及二叉搜索树实现
STL源码剖析学习笔记七 Deque
Deque
vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操作符,节省空间。但是其在分配的内存不够的情况下,需要对容器整体进行重新分配、拷贝和释放等操作,而且在vector中间插入或删除元素效率很低。
list是以节点形式来存放数据,使用的是非连续的内存空间来存放数据,因此,在其内部插入和删除元素的时间复杂度都是O(1),但是其不支持随机访问和存取,不支持下标,而且比vector占用的内存要多。
综合上述的优缺点,我们貌似需要一个支持随机访问和存取,支持下标访问,而且插入和删除的效率高的容器。于是,STL的deque诞生了。
deque相比于vector最大的差异就在于支持常熟时间内对首尾两端进行插入和删除操作,而且deque没有容量的概念,其内部采用分段连续内存空间来存储元素,在插入元素的时候随时都可以重新增加一段新的空间并链接起来。deque提供了Ramdon Access Iterator,同时也支持随机访问和存取,但是它也为此付出了昂贵的代价,其复杂度不能跟vector的原生指针迭代器相提并论。
STL源码剖析笔记<六> 序列式容器-list
list
vector是以线性空间存储数据,list是由链表实现,每次插入,删除一个元素就配置或者释放一个元素空间,list对于空间的利用是精准不浪费的,对于任何位置元素的插入或者移除,List都是线性时间
list实现一些重要的特性
list是一个双向链表,而且还是一个环状的链表。
在尾端之后加上一个空白节点,在代码种为node,便可以表示整个链表了。12iterator begin(){return (link_type)((*node).next);}itreator end(){return node;}插入操作和接合操作都不会造成原有的list迭代器失效。
这在vector是不成立的。因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效。甚至list的元素删除操作(erase),也只有“指向被删除元素”的那个迭代器失效,其他迭代器不受任何影响。- merge() 操作需要两个list内容都经过排序,
- reverse() 将链表逆序
- sort() List必须使用自己的sort(),因为STL算法sort() 只接受RamdonAccessIterator,SGI使用的quick sort
- 内部函数transfer是将连续范围的元素从一个List移动到另一个(或同一个)list的某个定点之前
STL源码剖析笔记<五> 序列式容器-Vector
序列式容器
所谓序列式容器,主要是指其中元素可序,但未必有序,C++本身提供一个序列式容器array,STL另外提供了vector,list,deque,stack,queue等等容器,其中stack和queue只是deque改头换面而来的,技术上可能更应该化为配接器(adapter)
vector
vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块头的array了。