自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

转载 信号量、互斥锁,读写锁和条件变量的区别

原文地址:信号量、互斥锁,读写锁和条件变量的区别 作者:qqrilxk信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量是,也可以完成一个资源的互斥访...

2019-03-29 09:48:02 332

转载 线程同步:原子操作、锁、二元信号量、信号量、互斥量、临界区、读写锁、条件变量

原子操作共享数据(全局变量或堆变量)的自增(++)操作在多线程环境下会出现错误是因为这个操作(一条c语句)被编译为汇编代码后不止一条指令,因此在执行的时候可能执行了一半就被调度系统打断,去执行别的代码。我们把单指令的操作称为原子的(Atomic),因为无论如何,单条指令的执行是不会被打断的。为了避免出错,很多体系结构都提供了一些常...

2019-03-29 09:43:06 424

原创 引用和指针的区别和联系

一、引用的适用场景1.引用变量int a = 1;int& b = a;2.引用做函数的参数。函数中如果不需要对形参进行修改,最好在引用前加constvoid swap(int& left.int&right){ int temp = left; right = left; left = temp;}3.引用做函数的返回值。如果返回值出了函数的作用...

2019-03-19 16:10:41 204

原创 函数重载,函数重写(同名覆盖),函数重定义(同名隐藏)

三重-------函数重载,函数重写(同名覆盖),函数重定义(同名隐藏) 一、函数重载直接上图吧!概念:函数重载是一种特殊情况,C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不...

2019-03-17 15:09:47 2014

转载 【C++】unordered_map,unordered_set,map和set的用法和区别

参考链接:https://blog.csdn.net/zjajgyy/article/details...

2019-03-16 18:03:23 716

转载 C++中STL常用容器的优点和缺点

我们常用到的STL容器有vector、list、deque、map、multimap、set和mu...

2019-03-16 17:52:54 162

原创 C语言中%d,%o,%f,%e,%x的意义

格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。 格式字符有d,o,x,u,c,s,f,e,g等。 如%d整型输出,%ld长整型输出,%o以八进制数形式输出整数,%x以十六进制数形式输出整数,%u以十进制数输出unsigned型数据(无符号数)。%c用来输出一...

2019-03-09 16:41:06 1441

转载 取消Linux下VIM的自动备份功能 Linux下文件名后面带有~ 解决方法

产生原因通过文本编辑器,如VIM打开文件,会生成一个相同文件名+波浪号的文件。这个带波浪号的文件是VIM的备份文件。解决办法**1.**删除方式可以通过以下命令删除目录下所有的这类备份文件:rm -fr .~2.永久解决方法1):取消vim自动备份的设置进入到vim的安装目录,一般为 /usr/share/vim/vim72如果有 .vimrc.vim 文件,查找到该文件...

2019-03-07 17:04:53 660

原创 【LeetCode】876. 链表的中间结点

题目描述给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5]) 返回的结点值为 3 。(测评系统对该结点序列化表述是 [3,4,5])。 注意,我们返回了一个 ListNode 类型的对象 ans,这样: ans.val = 3, ans....

2019-03-04 17:53:29 94

原创 【LeetCode】21-合并两个有序链表

题目描述将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4合并两个有序链表,首先创建一个头结点,然后根据两个链表的val大小插入新链表中,当一个链表结点为空时,跳出循环,将另一个链表的剩余所有节点接到新链表后...

2019-03-04 17:30:59 144

原创 归并排序讲解及代码实现

基本思想将待排序的元素序列分成两个长度相等的子序列,对每一个子序列排序,然后将他们合并成一个序列。合并两个子序列的过程称为二路归并int array[] = {21, 25, 49, 25, 16, 8, 31, 41};代码实现void _MergeSort(int *a, int left, int right, int *tmp){ if (left >= righ...

2019-03-04 16:16:29 3752 2

原创 快速排序讲解及代码实现

基本思想快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。代码实现第一种方法:左右指针法1.begin从最左边开始,end从最右边开始,用三数取中法设置...

2019-03-04 16:04:38 216

原创 冒泡排序讲解及代码实现

基本思想思路:将相邻两个数进行比较然后交换,一趟冒泡可以将最大的数放在最后。代码实现void BubbleSort(int* array, size_t n) //冒泡排序{ int i, j = 0; int temp = 0; for (i = 0; i < n; i++) { for (j = i + 1; j < n; ...

2019-03-04 15:13:50 274

原创 堆排序讲解及代码实现

基本思想创建堆:升序—>大堆,降序—>小堆执行如下步骤,直到数组为空:把堆顶array[0]元素和当前最堆的最后一个元素交换堆元素个数减1由于第1步后根节点不再满足最堆定义,向下调整根结点代码实现void HeapAdjustDown(int* array, size_t n,int parent) //向下调整{ int temp = 0; in...

2019-03-04 15:06:44 782

原创 直接选择排序讲解及代码实现

基本思想每一趟(第i趟,i=0,1,…,n-2)在后面n-i个待排序的数据元素集合中选出关键码最小的数据元素,作为有序元素序列的第i个元素。待到第n-2趟做完,待排序元素集合中只剩下1个元素,排序结束。在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换在剩余的array...

2019-03-04 14:47:34 625

原创 希尔排序讲解及代码实现

基本思想希尔排序可以理解为直接插入排序的优化对于数据量大及数据逆序相对直接插入排序效率高:分为两步:1.预排序:使数据接近有序,大的数据尽量向后移动,小的数据尽量向前移动2.当gap=1时,即为直接插入排序,gap与数组大小有关代码实现void HillSort(int* array, size_t n) //希尔排序{ assert(array); int end...

2019-03-04 14:37:54 341

原创 常见排序算法讲解(代码实现、时间复杂度及稳定性)

排序排序:就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。排序码:通常数据元素有多个属性域可用来区分元素,作为排序依据,该域即为排序码。其中有一个属性域可用来区分元按照主排序码进行排序,排序的结果是唯一的。按照次排序码进行排序,排序的结果可能是不唯一的。排序算法稳定性如果在元素序列中有两个元素R[i]和R[j],它们的排序码K[i]== k[j],且在排序之前,元素R[i]在...

2019-03-04 13:25:25 265

原创 直接插入排序讲解及代码实现

基本思想每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的合适位置上去,直到元素全部插完为止。当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后...

2019-03-04 13:17:57 13075 4

原创 【剑指Offer】从尾到头打印链表

题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路因为要反转链表,所以链表的尾做头结点,链表的头做尾结点,这样就想到了栈的先进后出原则,将链表的所有结点入栈,然后每次取栈顶的结点放入ArrayList中,然后将栈顶元素出栈,即可达到效果。代码/*** struct ListNode {* int val;* struct ...

2019-03-03 16:48:55 83

原创 【LeetCode】206-反转链表

题目描述反转一个单链表。输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL思路这道题的首节点会一直改变,我们先创建一个 result 空结点,然后通过循环,将链表反向链接起来,因为反向链接会丢失原链表的下一个结点的指针,所以要先将下一个

2019-03-03 16:43:14 89

原创 【LeetCode】28.实现strStr()

题目描述给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例1:输入: haystack = “hello”, needle = “ll”输出: 2示例2输入: haystack = “aaaaa”, needle = “bba”输出: -1...

2019-03-01 15:00:02 92

原创 一维数组及二维数组的传参问题

一维数组的传参方法一:传数组名编译器会把这里的 array 解析成指向整型元素的指针,也就是数组的首地址,方括号里面的数组编译器会忽略,写不写都可以,最好不写,以免引起误解。void test(int array[]){}方法二:传指针array是指向数组的指针,数组名是首元素的地址。 但是在 sizeof(数组名) 和 &(数组名) 两组情况下,数组名指整个数组。void...

2019-03-01 12:33:18 1014

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除