作者归档:Dante

RSS feed of Dante

最后更新于 .

用C++的stl库,相信大家都有用vector的经历,毕竟vector支持直接下标方式取数据的确方便很多。

但是vector默认是不提供find方法的,所以我们在查找的时候,通常这样写代码:

vector<int> vec;
for(unsigned int i = 0;i<vec.size();++i)
{
    if(vec[i]==xxx)
    {
        break;
    }
}

并不是说提供不了,而是stl库中实际上已经有通用的find函数(不止find……)

可以看一下下面的代码:

int main(int argc,char* argv[])
{
    vector<int> vec;
    vec.push_back(123);
    vec.push_back(456);
    vector<int>::iterator findit = find(vec.begin(),vec.end(),123);
    //vector<int>::iterator findit = find(vec.begin ...

最后更新于 .

最近准备已久的模板载入插件 load_template 终于搞定了,现在正式放出下载大家使用.www.vim.org上已经放出了下载链接,如下: http://www.vim.org/scripts/script.php?script_id=2957 注:不好意思,由于之前我的疏忽,部分在vimrc中的变量没有放到插件中,已经修正,在www.vimer.cnwww.vim.org均可下载 就不多废话了,直接把写的中文介绍文档贴到这里啦

1.简单介绍     

该插件主要实现了自动载入各种模板的功能(如类模板,html模板,makefile模板等等),并且支持动态模版的功能,即能够通过脚本动态的实现文件名,类名的替换。(默认已经提供了简单main函数模板、单体类模板、html标准模板、xml标准模板)

2.使用说明     

1)下载load_template.vim插件,并放在plugin的目录下 ...

最后更新于 .

各位在终端下用vim的朋友们~~我想我绝对给大家带来了一个福音~~哈哈 想必每个人都受不了终端下vim那阴暗、简陋的配色吧,而且就算用 :color xxx 来选择那些支持终端配色的配色方案也不能改变什么,是不是很郁闷?! 先给大家上个图,哈哈,感觉怎么样? zhongduan

(注:请尽量在XShell或者putty下使用,secureCRT由于自身颜色显示问题不是很完美,但也是可以用滴!~) 嗯嗯,其实很简单啦,只需要在vimrc中配置上这样一句话,来指定配色方案是256色就可以啦

set t_Co=256

这个配色方案的名字叫 darkburn.vim ,他的配色在windows下gvim的表现并不怎样,但是在终端下的表现反而非常出色,大家可以去试试哦 版权所有,转载请注明出处.https://www.vimer.cn

最后更新于 .

最近正在忙着做一个新的vim插件,功能可以说是完全为技术用家准备的,当然非技术用户也可以非常好的使用,代码已经写完了,中文介绍文档也已经ok了,剩下的就是老婆大人那边帮忙翻译出英文版的啦~ OK,废话不多好,为了过几天就会端出来的正餐,今天先给大家一些小甜点吧 今天主要是想实现在cpp文件中,自动添加.h文件的引用. 即在一个class1.cpp中,能够自动的添加一行代码

#include "class1.h"

其实这个功能可以说是很简单了,但是习惯偷懒的我,确实忍受不了每次都要去写一遍代码: vim脚本如下(特别说一下,有朋友反映我的vim脚本代码总是不高亮,结果换成高亮的html代码之后,总是保存出现问题,郁闷了,看样子还是继续调整一下):

function InsertIncludeFileI()     
    let sourcefilename=expand("%:t")     
    let outfilename=substitute(sourcefilename,'\(\.[^.]*\)$','.h','g')     
    call setline('.','#include "'.outfilename.'"') 
endfunction 
imap <c-b><c-h> <ESC>:call InsertIncludeFileI()<CR> 
function InsertIncludeFileN()     
    let ...

最后更新于 .

呵呵,废话不多说,先看看到底是啥好玩的语言特性~~
1.

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
int main(int argc,char* argv[])
{
    char a[20]=“world”;
    printf(“%c\n”,a[2]);
    printf(“%c\n”,2[a]);
    return 0;
}

对于这段代码,你觉得是否会编译通过,并且正确运行呢?

2.

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
class Foo {
  public ...

最后更新于 .

好吧,我承认,我完全是为了让ctags每天固定时间点帮我给vim生成tags文件……
crontab说明 :

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

参数 :

crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。

时程表的格式如下 :

f1 f2  f3 f4  f5 command
分 时 日 月 周 ...

最后更新于 .

今天组内调来了一个架构组的大牛,结果一来就给我的代码找出了一个问题。唉,还是学艺不精啊。
问题如下:通常我们在使用C++的new的时候,都是这样用的:


char *temp = NULL;
temp = new char[1000];
if(temp == NULL)
{
return false;
}

初看起来似乎没有问题,我们来做个测试,测试代码如下:


int main(int argc,char* argv[])
{
char *test=NULL;
while(1)
{
test = NULL;
test = new char[1000000];
if(test == NULL)
{
printf("I am wrong\n");
break;
}
}
printf("I am ok!\n");
return ...

最后更新于 .

呃,真不知道是我推广有误,还是别的原因。至今组里还是我一个人用vim做开发环境,大家倒是对vim的正则表达式更感兴趣,当然,实际上是,对让我帮忙操作更感兴趣…… 今天小组有一次大的对外数据迁移,同事有个需求,要在一个300多万行的文本文件中,将前150多万删掉…… 于是,我打开vim,到150多万行,然后dgg。 结果,可想而知……死机…… 同事转而求其他,用awk命令…… 脚本如下:

awk 'NR>1759668 {print $1" "$2}' uin_newopenid_0 >uin_newopenid_0_haha

上面命令的意思就是,将大于1759668行的号码,从 uin_newopenid_0 中写入到 uin_newopenid_0_haha,相当于间接实现了删除操作。 整个过程不到5秒…… 唉,果然用正确的工具做正确的事情才是王道啊。 不过我还是强烈推荐大家用vim做代码编辑器,IDE~~~~~ 哈哈,就这样啦~ 版权所有,转载请注明出处.https://www.vimer.cn

最后更新于 .

在使用C++时,我们经常会使用到STL,相信很多人都想过,如果vim能实现stl库自动补全就好啦,这篇文章,我们就来实现这一点。 (文中所有操作均在windows下进行,在linux也一样可以实现,笔者就不写了)

1.请确保安装好了ctags,和omnicppcomplete;如果你还没有安装好,请参考这两篇文章:把VIM打造成一个真正的IDE(2)把VIM打造成一个真正的IDE(3)

2.下载STL库的头文件和实现。下载路径如下: http://www.vim.org/scripts/script.php?script_id=2358

OK,现在工具已经准备齐了,接下来就是生成tags啦。 去刚下载的STL目录,用ctags命令生成tags文件,命令如下:

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .

(如果你看了我之前的文章,那么直接用F12生成就行)

有了tags之后,你可以把这个tags换个名字,比如叫stl_tags,然后放到C盘,通过命令

set tags ...

最后更新于 .

这几天在做一个API的时候,由于后端服务器量太多,导致前段webserver的CGI连接数过多,所以,不得不使用连接池来进行管理。(好吧,我知道说出来有点恐怖,600台webserver,125台32G的cache服务器,也就是cache量接近3T……)
之前有人实现过,大体思路如下:
1)定义一个list数组,里面的每个指针对象维护一条连接,并且为list规定一个最大值。
2)每当有信莲连接生成时(或者已经有的连接重新使用),就向list中添加一个对象;如果list的大小已经大于最大值,那么就把最后一个对象关闭并且扔出连接池(也就是要求,在这个对象的连接被断掉后,这个对象再次使用时,应该有重连的功能)

这样做的确比较简单,但是也会产生如下几个问题:
1)在第二点中,如果是已经有的连接重新使用,假设我们规定list的最大大小为1,那么这个被重复使用的连接实际上是在被重复的关闭和重新打开。
2)没有权重的概念,即可能对于一个访问频率比较高的连接,很可能会被一个访问量比较低的连接冲击导致连接断掉。

基于以上考虑,我重新设计了一套连接池模型:

typedef _conn_info
{
    int iCreateTime;//就是创建这个结构体的时间(第一次建立连接时的时间)
    int iLastTime;//最后一次被调用的时间
    int iReq;//被使用到的次数
    CConnClass* ptrConn;//对象的指针,维护着一个长连接 ...