- 博客(281)
- 资源 (4)
- 收藏
- 关注
原创 g++ 编译选项
g++ 编译参数详解介绍代码编译过程分为:预处理,生成.i文件编译,转换成汇编语言, 生成.s文件将汇编代码转换成机器码,生成.o文件链接目标代码,生成可执行程序总体选项-E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. gcc -E hello.c > pianoapan.txt gcc -E hello.c | more 慢慢看吧,一个hello wo
2015-08-26 14:06:53
2410
原创 C++的反思(知乎精华)
转载地址:c++的反思最近两年 C++又有很多人出来追捧,并且追捧者充满了各种优越感,似乎不写 C++你就一辈子是低端程序员了,面对这种现象,要不要出来适时的黑一下 C++呢?咱们要有点娱乐精神,关于 C++的笑话数都数不清:笑话:C++是一门不吉祥的语言,据说波音公司之前用ADA为飞机硬件编程,一直用的好好的,后来招聘了一伙大学生,学生们说我靠还在用这么落后的语言,然后换成C++重构后飞机就坠毁了
2015-07-21 11:23:01
7872
2
原创 最长公共子序列
一个字符串S,去掉零个或者多个元素所剩下的子串称为S的子序列。最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的。例如序列X=ABCBDAB,Y=BDCABA。序列BCA是X和Y的一个公共子序列,但不是X和Y的最长公共子序列,子序列BCBA是X和Y的一个LCS,序列BDAB也是。寻找LCS的一种方法是枚举X所有的子序列,然后注意检查是否是Y的子序列,
2015-07-06 20:37:37
1147
1
原创 快速排序-递归和非递归的实现
快速排序主要就是partition的操作。排序主体/* 递归的实现。A[] -->要排序的数组, s --> 开始位置, e --> 结束位置 */void quickSort(int arr[], int s, int e){ if (s < e) { int p = partition(arr, s, e); /* Partitioning index *
2015-07-06 17:40:53
1005
原创 二分查找求解equal_range区间
总觉得二分查找很简单,可实现起来却发现一个小错误会导致程序结果出错,本题是解决眼高手低的利题。eaual_range返回的一对指针,指向第一个等于key值得元素和指向第一个大于该值的元素。因此,除了常规的非重复元素的二分查找(重复元素可能查找到任意一个值),还可以实现equal_range的方式考察。先看常规的二分查找int binsearch(int arr[], int left, int ri
2015-07-06 17:27:14
1126
原创 大型网站的 HTTPS 实践(二)——HTTPS 对性能的影响
前言HTTPS在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS 也会降低用户访问速度,增加网站服务器的计算资源消耗。本文主要介绍 https 对用户体验的影响。HTTPS 对访问速度的影响在介绍速度优化策略之前,先来看下 HTTPS 对速度有什么影响。影响主要来自两方面: 协议交互所增加的网络 RTT(round trip time)。 加解密相关的计算耗时。
2015-07-03 10:22:32
1052
原创 大型网站的 HTTPS 实践(一)—— HTTPS 协议和原理
声明:本系列文章(共约4篇)转发自酷勤网,中间有我个人的修改或者注释。前言百度已经于近日上线了全站 HTTPS 的安全搜索,默认会将 HTTP请求跳转成HTTPS。本文重点介绍HTTPS协议, 并简单介绍部署全站HTTPS的意义。HTTPS 协议概述HTTPS可以认为是 HTTP + TLS。HTTP 协议大家耳熟能详了,目前大部分 WEB 应用和网站都是使用 HTTP 协议传输的。TLS 是传输层
2015-07-03 10:13:47
1128
原创 70个shell常用操作
1) 如何向脚本传递参数 ?./script argument例子: 显示文件名称脚本./show.sh file1.txtcat show.sh#!/bin/bashecho $12) 如何在脚本中使用参数 ?第一个参数 : $1,第二个参数 : $2例子 : 脚本会复制文件(arg1) 到目标地址(arg2)./copy.sh file1.txt /tmp/cat copy.sh#!/
2015-07-01 14:35:48
1397
原创 Python中的函数详解
声明:转载自伯乐在线Python中的函数,无论是命名函数,还是匿名函数,都是语句和表达式的集合。在Python中,函数是第一个类对象,这意味着函数的用法并没有限制。Python函数的使用方式就像Python中其他值一样,例如字符串和数字等。Python函数拥有一些属性,通过使用Python内置函数dir就能查看这些属性,如下代码所示:def square(x): return x**2>>>
2015-06-30 10:57:24
1107
1
原创 C++11并发编程-条件变量(condition_variable)详解
<condition_variable >头文件主要包含了与条件变量相关的类和函数。相关的类包括 std::condition_variable和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数 std::notify_all_at_thread_exit(),下面分别介绍一下以上几种类型。std::condition_variabl
2015-06-25 16:34:22
3077
原创 Linux作业管理
在介绍作业管理之前需要先知道,作业管理是在bash环境下使用的。也就是说“当登入系统获取bash shell之后,在单一终端界面下,同时管理多个作业”。这样应该了解到:管理作业时,其实每个作业都是当前bash的子程序,即彼此之间是有关联的。我们无法以作业管理的方式由tty1的环境去管理tty2的bash。直接将命令放到后台“执行”的&在bash的环境下, 前台指:你可以控制的作业。后台指:在内存可以
2015-06-17 10:28:48
1305
原创 原始字符串字面量
原始字符串字面量(raw string literal)是可以横跨多行代码的字符串字面量,不需要转义嵌入的双引号,像\t和\n这种转义序列不按照转义序列的方式处理,而是按照普通文本的方式处理。如果像下面这样编写普通的字符串字面量,那么会收到一个编译器错误,因为字符串包含了未转义的引号:string str = "Hello "World"!"; // Error! 对于普通的字符串,必须转义双
2015-06-17 08:53:26
1343
原创 为包含指针的关联容器指定比较类型
错误是怎么来的?我写下这样的代码: set<string*> ssp; ssp.insert(new string("Ant")); ssp.insert(new string("Wom")); ssp.insert(new string("Lem")); ssp.insert(new string("Pen")); for (set<string*>:
2015-06-16 15:43:00
617
原创 使用C++11中的遍历工具
处理日期和时间的chromo库duration表示一段时间间隔,表示几秒、几分钟等。typedef duration<Rep, ratio<60,1>> minutes;typedef duration<Rep, ratio<1,1>> seconeds;typedef duration<Rep, ratio<1,1000>> milliseconds;Rep表示时间数值,ratio表示时
2015-06-16 11:14:49
885
原创 半同步半异步线程池的实现(C++11)
简介处理大量并发任务时,一个请求对应一个线程来处理任务,线程的创建和销毁将消耗过多的系统资源,并增加上下文切换代价。线程池技术通过在系统中预先创建一定数量的线程(通常和cpu核数相同),当任务到达时,从线程池中分配一个线程进行处理,线程在处理完任务之后不用销毁,等待重用。线程池包括半同步半异步和领导者追随者两种实现方式。线程池包括三部分,第一层是同步服务层,它处理来自上层的任务请求。第二层是同步队列
2015-06-16 09:19:04
1105
2
原创 知乎C++问题整理
如何兼顾性能,合理选择C++STL容器?ANSER:首先要搞清楚,如果STL有性能问题,那么问题出在哪里?STL可以简单地认为就是算法+数据结构,所有容器的算法选择和实现都是经过精心设计和严格测试的,几个主流STL实现都不会有大问题。性能问题通常都出在内存数据操作上,内存操作有三种,内存读取、内存复制和内存分配。所以选择合适容器的依据就是要尽量减少内存操作尤其是复制操作,比如频繁中间插入删除就不要选
2015-06-15 11:33:43
1289
原创 随机洗牌算法---我们一起谈谈
看到这个问题是在知乎上, 一个回答:实现一下#include <iostream>#include <vector>#include <string>#include <algorithm>using namespace std;const int RAND_MAXNUM = 100;int bigRand(){ return RAND_MAXNUM*rand() + rand(
2015-06-12 20:42:23
854
原创 mov指令详解
MOV指令可以在CPU内或CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,立即数到寄存器,立即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄存器(注意立即数不能直接送段寄存器),从段寄存器到寄存器或存储单元。 但是注意(1) MOV指令中的源操作数绝对不能是立即数和代码段CS寄存器; (2) MOV指令中
2015-06-12 17:02:56
16214
1
原创 600字读懂 Git
原文地址设想你现在位于 alpha/ 目录下,这里有一个文本文件 number.txt,里面的内容只有一个词:“first”。现在执行 git init 将这个 alpha 文件夹初始化为 Git 仓库。执行 git add number.txt 会将 number.txt 添加到 Git 的索引(index)中。这个索引记录了所有 Git 保持追踪的文件,现在它有了一个映射记录 number.tx
2015-06-11 19:37:21
797
原创 什么是垃圾回收
乍一看,垃圾回收所做的事情应当恰如其名——查找并清除垃圾。事实上却恰恰相反。垃圾回收会跟踪所有仍在使用的对象,然后将剩余的对象标记为垃圾。牢记了这点之后,我们再来深入地了解下这个被称为“垃圾回收”的自动化内存回收在JVM中到底是如何实现的。手动管理内存在介绍现代版的垃圾回收之前,我们先来简单地回顾下需要手动地显式分配及释放内存的那些日子。如果你忘了去释放内存,那么这块内存就无法重用了。这块内存被占有
2015-06-11 09:12:44
945
原创 判断大小端序的C程序
概念大端格式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。 小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。如5A6C中5A是高字节、6C是低字节,在大端序机器中,高字节位于低地址中,即在大端序中按照5A6C存储,在小端序中按照6C5A存储。为什么存在这种模式因为在计算机系统中,我们是以字节为单位的,每个地址单元都对
2015-06-10 17:18:26
928
原创 字符串全排列的递归实现
#include "stdafx.h"#include <iostream>#include <assert.h>using namespace std;void permutation(char *pStr, char* pBegin){ assert(pStr&&pBegin); if (*pBegin == '\0') cout << pStr << e
2015-06-10 15:52:23
770
原创 构造函数为什么不能是虚函数
从存储空间角度看虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。从使用角度虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用
2015-06-08 23:00:30
997
原创 C++中的虚析构函数、纯虚析构函数详解
C++中析构函数可以为纯虚函数吗?众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用。那么析构函数是否可以设为纯虚呢?class CBase{ public: CBase() { printf("CBase()\n"); } virtual ~CBase
2015-06-08 22:03:48
3600
原创 看懂大数据的技术生态圈 Hadoop,hive,spark(转载)
先给出原文链接: 原文链接大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的。你可以把它比作一个厨房所以需要的各种工具。锅碗瓢盆,各有各的用处,互相之间又有重合。你可以用汤锅直接当碗吃饭喝汤,你可以用小刀或者刨子去皮。但是每个工具有自己的特性,虽然奇怪的组合也能工作,但是未必是最佳选择。大数据,首先你要能存的下大数据。传统的文件系统是单机的
2015-06-04 11:16:45
852
原创 Make 命令教程详解
make是工程构建的必要工具。Make的概念Make这个词,英语的意思是”制作”。Make命令直接用了这个意思,就是要做出某个文件。比如,要做出文件a.txt,就可以执行下面的命令。$ make a.txt但是,如果你真的输入这条命令,它并不会起作用。因为Make命令本身并不知道,如何做出a.txt,需要有人告诉它,如何调用其他命令完成这个目标。比如,假设文件a.txt 依赖于b.txt 和 c.t
2015-06-01 19:59:49
1102
原创 重载,重写(覆盖)和隐藏的区别
重载重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。class A{public: void test(int i); void test(double i); void test(int i, double j); void test(dou
2015-05-31 15:36:31
919
1
原创 笔记(const)
常量#include <iostream>using namespace std;int main(){ int i = 12; const int ci = 12; const volatile int *ip2 = &i; cout << *ip2 << endl; i = 14; cout << *ip2 << endl; retu
2015-05-31 11:24:54
665
原创 STL-map中的插入操作详解
首先,我们可以如下使用map://#include <map>map<string, int> simap;map[string("hou")] = 1;map[string("hou")] = 2;pair<string, int> value(string("ha"), 5);simap.insert(value);先看insert操作的源码: pair<iterator,bool> i
2015-05-22 10:40:40
1408
原创 Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数
概述随着流行的缓冲区溢出攻击的增加,越来越多程序员开始使用带有大小,即有长度限制的字符串函数,如strncpy() 和strncat() 。尽管这种趋势令人十分鼓舞,但通常的标准C 字符串函数并不是专为此而设计的。本文介绍另一种直观的,一致的,天生安全的字符串拷贝API 。当函数 strncpy()和 strncat()作为 strcpy()和 strcat()的安全版本来使用时,仍然存在一些安全隐
2015-05-20 20:28:23
1152
原创 python中的引用和复制
>>> a = [1,2,3,4]>>> b = a>>> b is aTrue>>> b[2] = -100>>> b[1, 2, -100, 4]>>> a[1, 2, -100, 4]a和b引用的是同一个对象,修改其中的一个将影响另一个。对于像列表和
2015-05-20 10:33:01
694
原创 #详解C++中的指针与引用
指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作。但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此介绍一下指针和引用,力争将最真实的一面展现给大家。1、指针和引用的定义在深入介绍之前我们首先来看一下指针和引用的定义、指针和引用的区别,然后分别针对指针和引用展开讨论,深入细节为何有这些差异。指针的权威定义: In a declaration
2015-05-14 10:31:29
661
原创 python进阶(数据结构和算法[三])
在字典上将键映射到多个值上一键多值字典d = {'a':[1,2,3], 'b':[4,5]}e = {'a':{1,2,3}, 'b':{4,5}}可以使用from collections import defaultdict使用默认字典类,它的一个特点是自动初始化第一个值,后面只需要关注添加元素即可。from collections import defaultdictd = default
2015-05-11 11:14:39
681
原创 python进阶(数据结构和算法[二])
找到最大或者最小的N个元素heapq模块有两个函数–nlargest()和nsmallest()正好能解决我们的问题。>>> print(heapq.nlargest(3, nums))[43, 23, 8]>>> print(heapq.nsmallest(3,nums))[-1, 1, 2]#anotherimport heapqportfolio = [ {'name': 'IBM
2015-05-11 09:36:55
932
原创 python进阶(数据结构和算法[1])
将序列分解为单独的变量>>> p = (4,5) # 通过赋值分解元组或序列>>> x,y = p>>> x4>>> y5>>> data = ['ACME', 50, 91.9, (2000,1,1)]>>> name, shares, prices, date = data>>> name'ACME'>>> date(2000, 1, 1)>>> name, shares
2015-05-08 16:48:41
778
原创 图解TCP-IP协议
本文原文链接通过两个图来梳理TCP-IP协议相关知识。TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道。如图1所示,给出了TCP通信过程的示意图。图1主要包括三部分:建立连接、传输数据、断开连接。建立TCP连接很简单,通过三次握手便可建立连接。建立好连接后,开始传输数据。TCP数据传输牵涉到的概念很多:超时重传、快速重传、流量控制、拥塞控制等等。断开连接的过程也很简
2015-05-05 10:50:40
926
原创 写代码的步骤(正确解决问题的一种可行性方法)
1. 确保你理解这个问题你自己最初的假设或者面试官的解释是模糊的,请先确保你完全理解问题并和面试官保持一致。2. 尝试一个简单的例子一个特殊的例子可能引导出如何解决一般情况下的问题,或者消除剩余部分的误解。3. 专注于解决问题的算法和数据结构这一步可能会很麻烦,要和面试官进行交流,或许可以得到一些提示或者否定你错误的想法。在找到一个完整的解决方案之前可能会忍不住想写代码。抵制这样的做法。抵制这样的做
2015-05-04 15:13:53
951
原创 STL--迭代器--原理与实践
迭代器(iterator)是STL里面很基础也很重要的一个东西,迭代器的traits技术设计的很棒。 迭代器是一种行为类似指针的对象,因为指针最常用的是->和*两个操作符,因此迭代器最重要的编程工作也是对这两个操作符的重载的实现。初探traits技术假设现在定义了这样一个迭代器MyIter,当我们拿到一个MyIter对象时,如何判断他的类型呢?template<class T>struct My
2015-05-03 11:35:29
1123
原创 typedef和typename关键字
类型说明typedef类型说明的格式为:typedef 类型 定义名;类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。定义名表示这个类型的新名字。例如: 用下面语句定义整型数的新名字:typedef int SIGNED_INT;使用说明后, SIGNED_INT就成为int的同义词了, 此时可以用SIGNED_INT 定义整型变量。例如: SIGNED_INT i, j;(与i
2015-05-03 11:06:05
752
原创 Shell 中的 here 文档详解
我们知道平常在linux命令行的操作都可以放到文件里面,赋予可执行权限后,就可以将这文件变成一个shell脚本。但是如果我们跟有些程序交互时,shell脚本却帮不了我们太多。比如编辑一个文件和操作数据库。编辑一个文件一般用vi,进去后hjkl的aio的操作什么的,脚本怎么执行?mysql登陆输入mysql -u 用户 -p 密码后,就跟mysql进行一串交互,shell怎么执行?Here Docum
2015-04-27 15:34:59
1633
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人