蓝新闻


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

OpenSSL 1.1.1的windows安装与使用VS断点调试

发表于 2018-12-10 | 分类于 C/C++ |

OpenSSL是常用的一个加密库或者说SSL实现库,常用在Linux下进行编译使用,但是在windows中也有使用的需求
在windows下进行编译安装之后,可以使用OpenSSL库,但是在对代码进行调试的时候只能在OpenSSL给出的函数外部进行调试,无法进入到函数内部。本文便是给出windows环境下OpenSSL1.1.1的编译与调试

阅读全文 »

编译安装OpenSSL

发表于 2018-07-16 | 分类于 C/C++ |

编译安装OpenSSL

用了好久的OpenSSL,都没有写篇博客来介绍一下

OpenSSL是一个开源的加密库,提供了https所需要的SSL层支持。

在ubuntu系统上可以直接使用sudo apt-get install openssl进行安装,但是由于版本原因,建议直接官网下载所需要的版本进行编译安装

阅读全文 »

设计模式<一> 观察者模式

发表于 2018-04-26 | 分类于 设计模式 |

买了本Head First设计模式,可惜里边使用JAVA写的。

对于里边的例子,打算用C++来实现。

第一个例子,观察者模式

阅读全文 »

数据结构学习<六> 手撕红黑树

发表于 2018-04-21 | 分类于 数据结构学习 |

手撕红黑树

红黑树复杂,何不自己来手撕一遍。

先给出代码,具体分析后边再写。

阅读全文 »

素数线性筛

发表于 2018-04-08 | 分类于 算法 |

素数打表是编程中常遇到的一个问题

阅读全文 »

常用排序算法及实现

发表于 2018-03-22 | 分类于 算法 |

排序算法

天下排序算法千千万,归根结底思想是不变的,让我们从头开始看看排序算法及实现

选择排序

选择排序的思想

选出数组中最小的元素,将其与第一个元素交换。然后找出次小的元素与第二个元素交换,一直进行下去,直到数组排完。选择排序是一种原址排序

时间复杂度: 平均情况 \(O(N^2)\),最坏情况\(O(N^2)\),最好情况 \(O(N^2)\)

空间复杂度:\(O(1)\)

稳定性:不稳定

实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//选择排序
void sort1(vector<int>& vec)
{
for (int i = 0; i < vec.size(); i++)
{
int min = vec[i];
int indexMin = i;
for (int j = i + 1; j < vec.size(); j++)
{
if (vec[j] < min)
{
min = vec[j];
indexMin = j;
}
}
if (indexMin != i)
swap(vec[i], vec[indexMin]);
}
}

阅读全文 »

数据结构学习<五> 树的性质及二叉搜索树实现

发表于 2018-03-15 | 分类于 数据结构学习 |

树

树是一种常见的抽象数据结构,一棵树的性质就是任意两个节点只有唯一的一条路径

二叉树

我们一般都分析的是二叉树,对于一个节点要不是内部节点要不是外部节点,外部节点又叫叶子,内部节点有左子树或者右子树或者都有。

##二叉树的性质

  • 一棵有N个内部节点的二叉树有N+1个外部节点
  • 一棵有N个内部节点的二叉树有2N个链接:N-1个链接到内部节点,N+1个链接到外部节点
  • 有N个内部节点的二叉树的高度至少是\(lgN\),至多是\(N-1\)
  • 深度为\(k\)的二叉树至多有\(2^k-1\)个节点
阅读全文 »

STL源码剖析学习笔记七 Deque

发表于 2018-03-12 | 分类于 STL学习 |

Deque

vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操作符,节省空间。但是其在分配的内存不够的情况下,需要对容器整体进行重新分配、拷贝和释放等操作,而且在vector中间插入或删除元素效率很低。
list是以节点形式来存放数据,使用的是非连续的内存空间来存放数据,因此,在其内部插入和删除元素的时间复杂度都是O(1),但是其不支持随机访问和存取,不支持下标,而且比vector占用的内存要多。
综合上述的优缺点,我们貌似需要一个支持随机访问和存取,支持下标访问,而且插入和删除的效率高的容器。于是,STL的deque诞生了。
deque相比于vector最大的差异就在于支持常熟时间内对首尾两端进行插入和删除操作,而且deque没有容量的概念,其内部采用分段连续内存空间来存储元素,在插入元素的时候随时都可以重新增加一段新的空间并链接起来。deque提供了Ramdon Access Iterator,同时也支持随机访问和存取,但是它也为此付出了昂贵的代价,其复杂度不能跟vector的原生指针迭代器相提并论。

阅读全文 »

STL源码剖析笔记<六> 序列式容器-list

发表于 2018-03-12 | 分类于 STL学习 |

list

vector是以线性空间存储数据,list是由链表实现,每次插入,删除一个元素就配置或者释放一个元素空间,list对于空间的利用是精准不浪费的,对于任何位置元素的插入或者移除,List都是线性时间

list实现一些重要的特性

  • list是一个双向链表,而且还是一个环状的链表。
    在尾端之后加上一个空白节点,在代码种为node,便可以表示整个链表了。

    1
    2
    iterator 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

发表于 2018-03-10 | 分类于 STL学习 |

序列式容器

所谓序列式容器,主要是指其中元素可序,但未必有序,C++本身提供一个序列式容器array,STL另外提供了vector,list,deque,stack,queue等等容器,其中stack和queue只是deque改头换面而来的,技术上可能更应该化为配接器(adapter)

vector

vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块头的array了。

阅读全文 »
123
Lan

Lan

26 日志
7 分类
7 标签
© 2018 Lan
由 Hexo 强力驱动
主题 - NexT.Mist