最后更新于 .

    OK,继续我们的Vim正则查找替换系列~~,这一次主要有两个技巧,第一个是=的整理,第二个是vim实现固定区域的查找替换。     呃,不知道到底是带给我们的这个习惯了,似乎大家在写int a=1;的时候都喜欢在=左右都加上两个空格,编程int a = 1;但是有时候面对别人写的代码,并不是这样的风格就会很想帮他改一下,怎么办呢?vim呗~~     命令如下:    

:%s/\s*=\s*/ = /g

   

这样的话,vim就会自动帮你完成啦,当然看语句也能看出来,他是只要匹配到=就会帮你自动编程 = ,所以对于那些注释和字符串中的=也有可能帮你误转,笔者没有想到什么好的方法,你可以在g后面加个c,即    

:%s/\s*=\s*/ = /gc

   

这样每次替换都会要求你确认,呵呵,不过也有点麻烦哦……    

好啦,接下来是vim中的区域查找替换,vim这么强大的工具当然是支持只替换一部分文本啦,那么怎么实现呢?     ...

最后更新于 .

一.有关hash_map的使用
map中可以用 map.erase(it++)或者it = map.erase(it);来实现迭代删除
但是在hash_map中

iterator erase(iterator it);

这个函数声明和定义是不存在的
取而代之的是

void erase(iterator it);

但它本身也没有实现迭代删除
如果要迭代删除的话 还是要用 erase(it++)

二.localtime()的误用
localtime的函数声明如下:

struct tm *localtime(const time_t *timep);

而localtime的内部实现是一个static变量,所以,如果你这样调用:

time_t t1=time(NULL);
struct tm *p1=localtime(&t1);
sleep(10);
time_t t2=time(NULL ...

最后更新于 .

1, c语言中,结构体struct中不能包括函数的,而在C++中struct中可以包括函数。
2,C++中结构体和类可以通用,区别主要表现在访问控制方面:struct中默认是public,而 class中默认的是private。
3,构造函数最重要的作用是创建对象的本身,C++中每个类可以拥有多个构造函数,但必须至少有一个构造函数,当一个类中没有显式提供任何构造函数,C++编辑器自动提供一个默认的不带参数的构造函数,这个默认的构造函数只负责构造对象,不做任何初始化工作。但在一个类中只要自己定义一个构造函数,不管带参不带参,编辑器不再提供默认的不带参的构造函数了。构造函数没有返回值。
4,析构函数当一个对象生命周期结束时候被调用来回收对象占用的内存空间。一个类只需有一个析构函数。析构函数没有返回值也不的带参数。
5,析构函数的作用与构造函数相反,对象超出起作用范围对应的内存空间被系统收回,或被程序用delete删除的时候,对象的析构函数被调用。
6,函数的重载条件:函数的参数类型、个数不同,才能构成函数的重载。重载是发生在同一个类中。
7,类是抽象的,不占用具体物理内存,只有对象是实例化的,是占用具体物理内存的。
8,this指针是隐含指针,指向对象本身(this指针不是指向类的),代表了对象的地址。所有的对象调用的成员函数都是同一代码段,但每个对象都有自己的数据成员。当对象通过调用它的成员函数来访问它的数据成员的时候,成员函数除了接收实参外 ...

最后更新于 .

调用:

strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] ...
[ -ofile ] [ -ppid ] ... [ -sstrsize ] [ -uusername ] [ command [ arg ... ] ]
strace -c [ -eexpr ] ... [ -Ooverhead ] [ -Ssortby ] [ command [ arg ... ] ]

功能:

跟踪程式执行时的系统调用和所接收的信号.通常的用法是strace执行一直到commande结束. 并且将所调用的系统调用的名称、参数和返回值输出到标准输出或者输出到-o指定的文件. strace是一个功能强大的调试,分析诊断工具.你将发现他是一个极好的帮手在你要调试一个无法看到源码或者源码无法在编译的程序. 你将轻松的学习到一个软件是如何通过系统调用来实现他的功能的.而且作为一个程序设计师,你可以了解到在用户态和内核态是如何通过系统调用和信号来实现程序的功能的.

strace的每一行输出包括系统调用名称,然后是参数和返回值.这个例子:

    
strace cat /dev/null

他的输出会有:

open("/dev/null",O_RDONLY) = 3

有错误产生时,一般会返回-1.所以会有错误标志和描述:

open("/foor/bar",)_RDONLY) = -1 ENOENT (no such file or ...

最后更新于 .

所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。
下面说一下如何创建一个线程。
通过创建线程,线程将会执行一个线程函数,该线程格式必须按照下面来声明:

void * Thread_Function(void *)

创建线程的函数如下:

int pthread_create(pthread_t *restrict thread,
      const pthread_attr_t *restrict attr,
      void *(*start_routine)(void*), void *restrict arg);

下面说明一下各个参数的含义:

thread:所创建的线程号。
attr:所创建的线程属性,这个将在后面详细说明。
start_routine:即将运行的线程函数。
art:传递给线程函数的参数。


下面是一个简单的创建线程例子:

#include <pthread.h>
#include <stdio.h>
/* Prints x’s to stderr. The parameter is unused ...

最后更新于 .

之前在vim下一直是用幼圆看中文(参见我的另一篇文章:Vim(gvim)编程字体推荐),效果其实还是很不错的,但是对于开启了cleantype的系统来说,微软雅黑可能是一个更好的选择。

后来也有朋友说很想在gvim下面使用微软雅黑,所以这次就和大家分享一下。    

之前不使用微软雅黑的原因也是很明显的,因为gvim默认的字体列表里面并不支持微软雅黑,至于原因网上也都说的很清楚了,也有人自己编译了gvim的全字体版提供下载,但是相信大部分人是和我一样,宁愿改字体也不想改gvim(vim)本身吧,呵呵。    

但是呢!只要vimer们想做的事情,那就绝对没有做不到的!~~~~

下面秀一下我的gvim中使用微软雅黑+Bitstream vera sans mono的样子~~    

10px(适合<14英寸屏幕)

   

10.5px(适合>17英寸屏幕)

哈哈,怎么样,是不是比幼圆精致很多啊!赶紧去试一下吧!~~

分别的配置代码如下:

10px

set guifont=Bitstream_Vera_Sans_Mono:h9:cANSI 
set gfw=Yahei_Mono:h10:cGB2312

10.5px

set ...

最后更新于 .

    今年的linux内核开发大会上,google的开发人员也上台做了名为“how google use linux"的演讲。我斗胆翻译注解一番——括号内为注解,欢迎读者斧正。
    原文链接参见:http://lwn.net/Articles/357658/

    (前面几段讲google对linux kernel代码的管理及跟进,偏细碎,不翻译了)
    在google为linux加入的代码中,3/4是对内核核心的改动,设备驱动代码只是其中相对较小的一部分。
    (linux发展到现在这个阶段,需要加入的新的设备驱动已经越来越少了)

    如果google要与linux社区的合作开发,那将面临一系列问题。跟上linux代码的主干太难——它的代码更新的太快了。在一个大型项目里,开发者对补丁的提交、重改确实是个问题。Alan Cox对此的回答十分简单:人总是贪得无厌的,但有时候就应该简单的对他们说”不“。
    (Alan Cox是linux kernel的二号功臣,现已加入Intel公司。我觉得Intel这样的CPU公司很适合内核开发者)

    在CPU调度上,google发现想改用新的cfs(“完全公平调度”,由Con Kolivasy在2.6.23中加入内核)非常麻烦。由于太麻烦,google不得不倒回去把O(1) sheduler ...

最后更新于 .

如何将一个字符串转换成大写或者小写?这是字符串匹配中经常需要做的事情,然而C++的Standard Library并没有提供将std::string转成大写和小写的功能,只有在提供将char转成大写(toupper)和小写(tolower)的功能而已。 但我们可以利用STL的transform配合toupper/tolower,完成std::string转换大(小)写的功能,也看到 模版编程 的威力了,一个transform函数,可以适用于任何类型,且只要自己提供 函数 ,就可完成任何Transform的动作。

C++

#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
using namespace std;
int main() {
    string s = "Clare";
    // toUpper
    transform(s.begin(), s.end(), s.begin(), ::toupper);
    // toLower
    //transform(s.begin ...

最后更新于 .

C++的string提供了replace方法来实现字符串的替换,但是对于将字符串中某个字符串全部替换这个功能,string并没有实现,我们今天来做的就是这件事。
首先明白一个概念,即string替换所有字符串,将”12212″这个字符串的所有”12″都替换成”21″,结果是什么?
可以是22211,也可以是21221,有时候应用的场景不同,就会希望得到不同的结果,所以这两种答案都做了实现,代码如下:

#include   <string>   
#include   <iostream>   
using   namespace   std;   
string&   replace_all(string&   str,const   string&   old_value,const   string&   new_value)   
{   
    while(true)   {   
        string::size_type   pos(0);   
        if(   (pos=str.find(old_value))!=string::npos   )   
            str.replace(pos,old_value.length(),new_value);   
        else   break;   
    }   
    return   str ...

最后更新于 .

互斥锁

尽管在Posix Thread中同样可以使用IPC的信号量机制来实现互斥锁mutex功能,但显然semphore的功能过于强大了,在Posix Thread中定义了另外一套专门用于线程同步的mutex函数。

1. 创建和销毁

有两种方法创建互斥锁,静态方式和动态方式。POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER来静态初始化互斥锁,方法如下:

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

在LinuxThreads实现中,pthread_mutex_t是一个结构,而PTHREAD_MUTEX_INITIALIZER则是一个结构常量。 动态方式是采用pthread_mutex_init()函数来初始化互斥锁,API定义如下:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)

其中mutexattr用于指定互斥锁属性,如果为NULL则使用缺省属性。 pthread_mutex_destroy()用于注销一个互斥锁,API定义如下:

int pthread_mutex_destroy(pthread_mutex_t *mutex)

销毁一个互斥锁即意味着释放它所占用的资源,且要求锁当前处于开放状态。由于在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。

2. 互斥锁属性

互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前(glibc2.2.3,linuxthreads0 ...