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这个元素是不进入排序的
- Objective-C 语法学习笔记
- Objective-C 语法学习笔记
- Objective-C 语法学习笔记1
- C语言学习笔记--基础语法一
- C语言学习笔记--基础语法二
- C语言学习笔记--基础语法四
- Objective-C语法笔记
- Learn Objective‐C,学习笔记01 语法结构
- Object-C学习笔记-基础篇-基础语法
- 【学习笔记之ios开发】1.Object-C语法概述
- 《Objective-C程序设计》学习笔记——语法篇
- 黑马程序员-ios学习笔记 C语言基础语法
- C语言学习笔记(一) -基本语法 Basic Grammar
- 【C语言学习笔记】基础语法及基本运算
- 【Objective-C学习笔记】基本语法、类与对象
- 【Objective-C学习笔记】核心语法——构造方法
- 【Objective-C学习笔记】核心语法——分类-Gategory
- (C/C++ 学习笔记)函数指针语法基础
- 编写yarn应用
- intell IDE初始用
- 3种解耦方式
- Codeforces 558B Amr and The Large Array(hash)
- Web开发技术十年发展历程
- C++ 语法学习笔记
- 你觉得测试人员的主要工作职责是什么?
- XMLHttpRequest对象的属性和方法
- 局域网共享文件
- java的世界
- 外贸企业建站为什么一定要选择国外服务器
- 关于PPP 2.4.5在CENTOS7 无法编译通过的解决方案
- Maven之自定义archetype生成项目骨架(一)
- 用MindNode描述了一个小项目思路