C++ 语法学习笔记

来源:互联网 发布:淘宝网活动 编辑:程序博客网 时间:2024/05/20 01:36

snprintf特殊用法:

snprintf(char* + size(int), 5, "%s", "1234567890");

理论上是不能这么用的,但是居然可以,意思就是保留char*原本的size位(原本的意思是直接洗掉char*里面的数)

然后再往后面加“1234567890”的前4位。

举个例子:

char test[] = "abcde"

int size = 3;

snprintf(test + size, 5, "%s", "1234567890");

那么test的值就是abc1234,因为保留abcde的前三位abc然后取1234加在后面(因为要保留一个/0)。


后来被一个同事启发,原来是可以理解的。因为snprintf本来就是从char*的地址后面加东西,所以指针+int本身是有含义的,含义就是指针偏移!所以意思就是,在原来的指针基础上向右偏移size位再往后写4位。这样就可以理解通了!这里还暴露了你一个漏洞就是,指针+int就是偏移的意思,你没有掌握好!

绝对不能用strcpy、strncpy系列的函数,太不安全了,要不就用上面说的这个,要不就用strlcpy。都比这两函数安全!


inline 
inline:内联函数,在编译过程中内联函数会直接被源代码替换,提高执行效率 如果类中的某个函数会被调用很多次或者放在循环中,那么建议将这个函数声明为内联,可以提高程序的运行效率。在函数定义的时候类型前面加即可。


hashMap以及其冲突:

首先要存储的东西是key-value。而存储的方式是通过把key值先转化成hashcode,方法不一定有签名有算法,转化之后设置表长。一般为总数据的两倍(减少冲突),然后对表长取余得到对应的index,但是index肯定会有相同的,而这就叫冲突!解决办法有常用的有两种:

1,往下找空位置,5号位有人了就写到6号位里,6号也有人就继续往下找直到找到null为止。find的时候也是一样,首先根据key找到对应的index,看看那个index对应的块中的key是不是你想要的,不是就向下遍历直到找到为止(因为插进去也是向下遍历,找也这样肯定不会错)。简单,但是效率有点低。

2,链地址法。其实就是使用数据结构{key, value,next}再加上索引entry数组共同管理。使用entry建立一个数组,然后entry的index就是哈希表的index。如果发生冲突情况就用到数据结构里的next了。假如A的index是4,那么entry[4] = A,说明4这个位置已经被A占领了。但是过一会儿发现,B的index也是4,所以entry[4] = B , B.next = A。因为A是new出来的所以不会自动消失,那么我们把entry[4]的位置让给新来的B,但是使用B里面的next记住我之前还有一个人叫做A。这样就把AB两者都放到了entry[4]里面而且不会遗漏了!


offset就是指向下一个node头地址的值。所以上一个node.offset - 本身的node.offset = 本身的长度。因为hashmap是连续的,所以下一个的头减去自己的头就是自己的长度。


 &引用符:

不单单可以用于函数的参数,还能用于定义变量的时候:

int a = 8;

int& b = a;

b = 5;//则a也等于5,这里相当于引用!


new完一个变量之后别忘了初始化:

C++ 的new是不包括初始化的,哪怕是char* new出来之后也不会给你加\0,所以安全起见一定要在第一位加上一个\0初始化一下。所以定义完变量之后初始化本身就是一个好习惯!


不要在循环里分配内存:

如果在循环里或者线程里new一个东西的话是特别耗费内存的,不建议这么做,还不如做个私有变量一直用或者直接在构造函数里初始化好!


如果有if else请把重要的情况放到前面:

这样会提高效率,不会走下面的路。


简单的打压程序:

当前秒数如果大于记录的秒数就重新计算qps且记录秒数++,如果还在这一秒里面就qps++,如果qps大于设定的值就sleep一秒。这样就相当于把多于你预设qps的请求都转移到下一秒里面了,能够保证qps不超过设定,但是累积下来平均响应时间会变长!


泛型模板:

使用泛型类的public函数的时候别忘了也要给函数加上模板而且别忘了base<T>::yourfunction()。

最重要的一点是,模板的实现与声明都要写在同一个文件里,不能分开写!


文件流每次打开只能读取一次:

如果要对比两个hash对一个文件的效率,一定要打开文件两次!!!不然前面那个文件读完了后面的文件就没法读了!!!


不要参考别人的代码:

不要老是想着看其他人的代码,更不要一边看一边写!因为这样你会缺少思考的过程,而这样子只能导致超级多的bug和超长的debug过程。比如说你写hash的两个bug,忘记初始化就使用指针和hash,以及没把值传进来就直接拿来用,以及hash->get居然忘了把用一个tmp去接一个值。这些低级错误都是因为你看着代码来写,缺少思考的过程导致的!


strtok:

用惯了Python的split,现在用C++就想找代替品。没错,就是strtok!不过strtok是线程不安全的,线程安全建议用strtok_r。

用法很简单:

char *p = strtok(char[], const char*);

例如:

char *p  = strtok("mimi,ddd,dsdsa,dd", ",");

while (p)

{

cout<<p<<endl;

p = strtok(NULL, “,”);

}

要注意的有两点,首先如果要第二个参数的话,要再次把NULL替换到strtok里,就能读取第二块的参数。还有一点最重要的,第二个参数,分隔符必须用双引号括起来“”。不能用单引号,不然会因为const报错失败的。


xmake:

要把新的文件加到makefile里面必须先xmake一遍,直接make的话新文件是没有加进makefile的。

client和test的目录天然比根目录高一级,所以xmake里需要更改目录的路径!


如果要处理除数有可能为0的情况:

要加if在做个判断,如果为0就把结果赋值为0.不要多个printf,一个printf就行,之前就把结果算好了,最后才输出结果!


sort:

sort(first, end)

first参数参与排序而end参数并不参与排序,也就是first~end-1的参数参与排序。因此直接用当前数组的size就可以了。

sort(first, first + size),first + size这个元素是不进入排序的



0 0
原创粉丝点击