自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

爱很遥远

事有其道

  • 博客(100)
  • 问答 (2)
  • 收藏
  • 关注

原创 std::sort排序算法

std::sort的声明语法:template void sort ( RandomAccessIterator first,RandomAccessIterator last );template void sort ( RandomAccessIterator first,RandomAccessIterator last, StrictWeakOrdering comp );

2017-06-07 18:13:25 16125 1

原创 char data[0]问题

问题:当进行内存管理时,经常需要一个额外的结构,例如struct MyData{    char*data;  // 指向分配的内存空间    intlen;  // 记录空间大小};这样,需要进行四步操作,先分配MyData结构体,再分配要管理的内存,再让data指针指向该内存空间,再把空间大小赋给len。问题,该结构在64位系统上sizeof结果是多少?可以修改结构体的

2017-06-07 09:05:15 1451

原创 python基础笔记-8

模块,就是一个py文件import my_module #使用时需要my_module.my_func()from my_module import my_func #使用时直接my_func() from my_module import func1, func2from my_module import *如果不同模块有相同名字的函数等,后导入的会覆盖前面导入的。尽

2017-05-31 23:06:49 295

原创 python基础笔记-7

异常处理try:         ….except (异常名, 异常名) as err:         处理except Exception  as  err:#捕获所有异常         处理else: #没有异常则进入         处理finally: #无论有没有异常都要执行         处理 Python3中一次捕获多个异常,需要

2017-05-31 23:04:19 318

原创 python基础笔记-6

面向对象 Python是动态语言,可以给对象动态添加属性和方法。 魔法方法__str__ 对象的字符串形式,print函数打印对象时,对象的__str__函数被调用,其返还的内容被打印。 私有属性和私有方法以__开头,在类外部不能直接使用 __del__ 方法对象被释放(引用计数为0)时Python解释器自动调用 sys.getrefcount(

2017-05-31 23:01:14 319

原创 python基础笔记-5

文件操作打开方式r 只读方式打开,不存在报错,open的默认打开方式w 只写方式打开,不存在创建,存在覆盖原内容a 只写方式打开,不存在创建,存在追加rb 二进制只读,不存在报错wb二进制只写,不存在创建,存在覆盖原内容ab二进制只写,不存在创建,存在追加r+读写方式打开,不存在报错w+读写方式打开,不存在创建,存在覆盖原内容a+读写方式打开,不存在创建,存

2017-05-31 22:56:32 260

原创 python基础笔记-4

函数返回多个值,默认为元组 局部变量,定义在函数中,只能在当前函数内使用;全局变量定义在函数外,任何地方都可以使用。函数内使用变量,先看局部变量,再找全局变量。如果要在函数内修改全局变量,需要先用global 声明一下,否则认为是定义了一个局部变量。全局变量必须定义在使用它的函数调用之前,不必在函数声明之前,但一般习惯把全局变量放在最前面。一般尽量避免全局变量和局部变量

2017-05-31 22:55:19 378

原创 python基础笔记-3

Python中的列表可以存储不同类型的数据 列表的添加append,将元素追加到列表尾insert 将元素插入到指定位置extend将一个列表添加到列表尾 列表append和extend如果参数都是列表,extend是将列表中的元素合并到目标列表中,append是将列表作为一个整体添加到目标列表中pop将尾部元素删除remove,删除指定内容的元素,从左查找,只删一

2017-05-31 22:53:51 245

原创 python基础笔记-2

字符串可以直接用+拼接也可以像print中格式化c = a + bd = “%s”%(a+b)字符串可以用下标访问单个字符,可以从后向前取,-1表示最后一个元素 字符串切片,区间是前闭后开的str[3:7] 从str[3]到str[6]str[3:-1] 从str[3]到倒数第二个str[3:] 从str[3]到串尾str[3:7:2] 步长为2,即

2017-05-31 22:50:44 263

原创 python基础笔记-1

程序中若有中文字符,Python3没有问题,Python2需要在程序开始添加#-*- coding:utf-8 -*-或#coding=utf-8推荐前者,注意不是下划线。 变量第一次出现时即定义,之后都是赋值。 交换变量的值a,b =b,a Python2和Python3中的input不同,Python2中input函数获取用户输入后,将其作为表达式执

2017-05-31 21:51:07 256

原创 vi常用命令

由命令模式进入编辑模式,之前只用了i,a,A,还有I(大写i),o,Oi——光标前插入a——光标后插入I——光标所在行首插入A——光标所在行末插入o——光标所在行的下面新建一行插入O——光标所在行的上面新建一行插入 yy 复制光标所在行4yy 从光标所在行开始复制4行p 粘贴dd 剪切光标所在行,不粘贴即是删除2dd 剪切光标所在行往下2行D 剪

2017-05-06 22:36:28 237

原创 linux命令

tar 不加-z,只打包不压缩。tar -cvf a.tarsource.filestar-xvf a.tartar -zcvfa.tar.gz source.filestar -zxvfa.tar.gztar -jcvfa.tar.bz2 source.filestar -jxvfa.tar.bz2  useradd name -m-m 同时创建家目录us

2017-05-06 22:35:21 221

原创 软链接和硬链接

软链接和硬链接软链接类似Windows中的快捷方式,只是一个符号。如果原文件删除,软链接失效。ln -s source.file slink.file硬链接,删除源文件,硬链接仍然有效。ln source.file link.file数据的硬链接数为0时,操作系统才删除数据。创建硬连接会增加引用计数,创建软连接不会增加引用计数。

2017-05-06 22:32:52 357

转载 用C++11的std::async代替线程的创建

http://www.cnblogs.com/qicosmos/p/3534211.htmlc++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的:void f(int n);std::thread t(f, 5);t.join();但是线程毕竟是属于比较低层次的东西,有时候使用有些不便,比如我希望获取线程函数的返回结果的时候,我就不能直接通过t

2017-05-02 11:08:24 222

原创 C++11多线程

一点笔记,后续展开。thread给线程函数传参默认是值传递,如果需要引用传递,使用std::ref对参数取引用。或是使用std::move取右值引用,前提是参数传递后不会在原线程使用。 std::thread::hardware_concurrency()获取CPU个数,对设置线程数有很大的参考意义。 std::lock使用死锁避免算法来Lock给定的Locka

2017-05-01 10:26:06 314

原创 C++11中的std::call_once

某些场景下,我们需要代码只被执行一次,比如单例类的初始化,考虑到多线程安全,需要进行加锁控制。C++11中提供的call_once可以很好的满足这种需求,使用又非常简单。头文件#include        template         void call_once (once_flag& flag, Fn&& fn, Args&&...args);        第一个参数是

2017-04-30 16:50:00 24531 1

转载 线程的join和detach

http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.htm在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时

2017-04-25 10:32:29 376

原创 自己编写的简单的线程池

利用C++11的std::thread,实现生产消费模型。/*任务接口*/#ifndef _ITASK_HEAD_#define _ITASK_HEAD_class ITask{public: ITask(void *arg = nullptr) :m_arg(arg) { } virtual ~ITask() { } void

2017-04-23 19:58:25 334

转载 线程池,这一篇或许就够了

原文  https://segmentfault.com/a/1190000009098623为什么用线程池创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率>例如:>>记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3>>如果T1+T3>T2,那么是不是说开启一个线程来执行这个任务太不划算了!>>正好,线程池缓

2017-04-19 22:26:31 301

原创 C++ Primer 右值引用和move语义

C++11中提供了移动对象而非拷贝对象的功能。有时候,对象拷贝后就立即销毁了,这时移动对象会大幅提升性能。很多情况下拷贝对象是不必要的,还有IO类及unique_ptr类这些不可拷贝的类对象,但可以移动。旧C++标准中,没有移动对象的方法,即使没必要拷贝也不得不拷贝。容器中所保存的类必须是可拷贝的。新标准中,容器可以保存不可拷贝的类,只要能被移动即可。标准库容器、string、shared_p

2017-04-19 22:15:57 476

原创 C++11 bind函数

bind标准库函数,定义在头文件functional中。可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。        调用bind的一般形式为:        auto newCallable = bind(callable,arg_list);        其中,newCallable是一个可调用对象,arg_l

2017-04-13 13:55:14 386

原创 如何定位CPU占用过高问题

程序运行后出现CPU占用过高,一般是代码有死循环等。top命令可以查看CPU使用情况,找到问题进程。对CPU使用过高的进程的所有线程进行排序ps H -e -o pid,tid,pcpu,cmd --sort=pcpu | grep xxx得到CPU占用率最高的线程的线程号,比如2907进程的线程2909使用gdbgdbgdb>attach 2907gd

2017-04-01 09:27:09 2725

转载 memmove和memcpy函数

两个函数都在头文件string.h中定义,函数原型为:        void * __cdecl memcpy(void *dst, const void *src, size_t count);        void * __cdecl memmove(void *dst, const void *src, size_t count);实现代码如下:void * __

2017-03-31 10:56:40 300

转载 多线程编程-条件变量

http://blog.chinaunix.net/uid-21411227-id-1826890.html1.引言:条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足。条件变量上的基本操作有:触发条件(当条件变为 true 时);等待条件,挂起线程直到其他线程触发条件。    条件变量要和互斥量相联结,以避免出现条件竞争--一个线程预备等待一个条件变量,当

2017-03-16 14:59:14 263

转载 条件变量基本概念和原理

http://hipercomer.blog.51cto.com/4415661/914841        条件变量的作用是用于多线程之间关于共享数据状态变化的通信。当一个动作需要另外一个动作完成时才能进行,即:当一个线程的行为依赖于另外一个线程对共享数据状态的改变时,这时候就可以使用条件变量        假设没有条件变量,对于一个生产者消费者问题,消费线程在得知队列中没有产品时,

2017-03-16 14:49:16 1035 1

翻译 RabbitMQ官网教程5——topic

前面的章节我们改进了日志系统,利用direct交换机,可以选择性的接收日志。但是,这仍然有局限,不能基于多个规则进行路由。在日志系统里,我们可能不只根据安全级别订阅日志,还可能想根据日志源来订阅。就像Unix 工具syslog,根据安全级别及设备来路由日志。这样就比较灵活了。为了实现这种效果,我们需要学习topic交换机。 topic交换机        发送到topic交换机的消息,

2017-03-09 23:04:21 386

翻译 RabbitMQ官网教程4——路由

前面的章节我们创建了一个简单的日志系统,可以把消息广播到许多接收者。本节我们将增加一个特性——只订阅一部分消息。比如只把错误日志输出到文件,同时把所有日志输出到屏幕。绑定        前面的例子里我们已经创建过绑定。绑定就是交换机和队列间的一种关系,简单解读为队列关注该交换机的消息。创建绑定时可以增加一个参数routing_key,为了避免跟basic_publish的参数混淆,

2017-03-08 23:15:52 266

原创 char*做map的key使用时的问题

今天在工作中使用到map时,map中用char*字符串做key,后面通过key做find操作,发现找不到之前插入的元素。通过网上搜索,得出结论,find时,默认使用== 进行判断,char*只是指针,如果两个字符串值相同,但是地址不同,是无法匹配的。        所以最好使用std::string。如果非要用char*,需要使用find_if函数并且用bind2sd函数指定比较函数。#i

2017-03-08 22:14:35 2623

翻译 RabbitMQ官网教程3——发布订阅

前面我们创建了工作队列,工作队列中每个任务只分发给一个worker。现在我们要把一个消息分发给多个消费者,这种模式就是发布订阅。为解释这种模式,我们将构建一个简单的日志系统,它包括两个程序——一个提交日志,另一个接收并打印。日志系统中每个接收程序的拷贝都会收到消息,这样可以一个将日志写入磁盘,另一个输出到屏幕。本质上讲,发布的日志消息被广播给了所有的消费者。 交换机        前面

2017-03-07 22:49:35 264

翻译 RabbitMQ官网教程2——工作队列

第一节中我们实现了简单的发送接收消息。现在我们创建一个工作队列,用于在多个worker中分配耗时任务。工作队列是为了避免立即执行资源密集型任务并等待其完成,有了工作队列,就可以稍后再处理任务。我们把任务封装成消息并发送到队列,后台的工作进程从队列中取出任务并执行。当有多个工作进程时,任务会在它们中分发。        web app中,在一个很短的http请求时长内不可能处理一个复杂的任务,这

2017-03-06 22:59:11 317

翻译 RabbitMQ官网教程1——Hello World

RabbitMQ是一个消息中间件——接收和发送消息。你可以把它想象成一个邮局,当你把邮件投递到邮箱后,你就可以确信邮递员最终会帮你把邮件寄给收件人。术语:        生产者——发送消息;        队列:“邮箱”,存在于RabbitMQ内。虽然消息可以在RabbitMQ及应用中流转,但是只能在队列中存储,队列没有限度,可以存储任意多的消息,多个生产者可以向一个队列中发送消息,多

2017-03-05 22:22:34 1265

原创 linux环境下的内存泄漏检查

Linux下的mtrace工具可以帮助我们检查程序中是否有内存泄漏。GNU扩展函数mtrace会为内存分配函数(malloc, realloc, memalign, free等)注册hook,记录malloc/free信息。        使用时也非常简单,只需在代码中调用mtrace函数即可。这需要包含头文件mcheck.h。同时需要设置环境变量MALLOC_TRACE,指定信息输出到哪个文

2017-03-02 21:54:36 527

原创 最长公共子串问题

程序员代码面试指南:最长公共子串问题动态规划:dp[M][N]矩阵,d[i][j]

2017-03-01 20:41:04 439

原创 最长公共子序列问题

程序员代码面试指南:        给定两个字符串str1和str2,返回最长公共子序列,存在多个时返回任意一个即可。动态规划:        str1长度设为M,str2长度设为N,构建dp[M][N]。d[i][j]表示str1[0:i]和str2[0:j]的最长公共子序列的长度。        1.第一列,d[i][0]表示str1[0:i]与str2[0]的最长公共子序列长

2017-02-28 21:42:20 256

原创 最长递增子序列

程序员代码面试指南:最长递增子序列,给定数组arr,返回其最长递增子序列。动态规划:生成数组dp, dp[i]表示以arr[i]结尾的最长子序列的长度。dp[0] = 1,dp[i]=max{dp[j]+1, j 从dp中得到最大值即为最长子序列的长度,其下标对应的arr中的值即为子序列的最后一个值。从该值开始向前遍历,如果前面一个值满足arr[j]C++实现:void getDP

2017-02-26 22:43:14 1000

原创 矩阵最短路径和

程序员面试指南中的一个题目:        给定一个矩阵m,从左上角开始每次只能向右或向下走,最后达到右下角的位置,路径上所有数字的累加和就是路径和,求所有路径中的最小路径和。        根据动态规划实现,构建矩阵dp,dp[i][j]为从左上角(0,0)到(i,j)的最小路径和。对于第一行,只能向右累加;对于第一列,只能向下累加。其他位置都是从其左侧或上面的点中选择较小的值再加上该节

2017-02-26 12:42:30 744

原创 用两个栈实现一个队列的基本功能

题目:用两个栈实现队列的基本功能。    实现:一个栈用于接受输入,一个用于输出,仅当输出栈空时,将输入栈中的数据一次性压入输出栈。以下实现中,该动作在pop和front中进行。    C++实现如下:template class MyQueue{public: void Push(const T& t) { m_in.push(t); }

2017-02-12 23:00:05 389

原创 实现一个getMin功能的栈

题目:实现一个特殊的栈,在实现栈基本功能的基础上,再实现返回栈中最小元素的操作。要求pop、push、getMin时间复杂度都是O(1),设计时使用现成的栈结构。    用C++实现了一下。template class MyStack{public: void Push(const T& t) { m_data.push(t); if

2017-02-12 21:47:44 479

原创 Python中的函数参数

默认参数:        默认参数必须放在必选参数后;        一般来讲,经常变化的参数放在前面,不经常变化的放在后面;        多个默认参数时,入参按顺序赋值,也可以用指定参数名的方式赋值。        默认参数必须指向不可变对象!因为函数定义时,默认参数就定义了,如果参数指向对象可变,调用函数时改变了对象,则下次调用函数时,默认参数的值就不是定义时的值了。 

2017-02-06 22:48:26 771

原创 单例模式

单例模式,即保证程序中一个类只有一个实例,并提供一个全局访问点。class CSingleton { private: CSingleton() {} // 私有构造函数 static CSingleton *m_pInstance; // 唯一实例public: static CSingleton *GetInstance()

2017-01-25 11:13:16 138

空空如也

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

TA关注的人

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