关于 vector 的扩容机制

往 vector 中添加元素时,如果空间不够将会导致扩容。 vector 有两个属性:size 和 capacity 。 size 表示已经使用的数据容量,capacity 表示数组的实际容量,包含已使用的和未使用的。 vector 扩容规则: 当数组大小不够容纳新增元素时,开辟更大的内存空间,把旧空间上的数据复制过来, ... 阅读更多

STL 中的迭代器失效

一、迭代器失效 向容器添加或者删除元素可能会导致指向容器的指针、引用或者迭代器失效。使用已经失效的指针、引用或者迭代器将会导致程序出现异常,编码过程中一定要时刻注意迭代器失效的场景。 例如,以 vector 为例:

执行以上代码会导致段错 ... 阅读更多

C++中的友元和运算符重载

一、友元 友元可以允许其他类或者函数访问自己的非共有成员,如果类想把它的函数作为友元,只需要增加一条以 friend 开头的函数声明即可。 1.1 添加外部函数作为友元 以下一个学生类,类中保存了学生的年龄、名字以及性别信息:

现在希望在 ... 阅读更多

国内几个优质的 Go Module 代理仓库服务

一、简介 go module 公共代理仓库,代理并缓存 go 模块。你可以利用该代理来避免 DNS 污染导致的模块拉取缓慢或失败的问题,加速你的构建。 简单来说就是国内访问被墙,go get 无法在线获取到仓库,代理仓库就是帮我们解决这个问题的。 二、使用方法 使用 go1.11 以上版本并开启 go module 机 ... 阅读更多

「缓存穿透」 、 「缓存击穿」 和 「缓存雪崩」 的概念和解决办法

一、缓存 缓存的作用一般是为了减轻数据库压力设计的,因为数据都是读写磁盘,当并发量大的时候,磁盘 IO 可能跟不上并发量。而缓存一般设计都是放在内存中的,最常见的例如 redis 和 memcached,都是把数据都缓存在内存中。读写内存的速度比磁盘快很多,因此把常用的数据都放到内存中做缓存可以给数据库减轻很 ... 阅读更多

Golang 中 glog 库的使用方法

一、关于 glog 库 golang 中的 glog 库是 google 著名开源 C++日志库 glog 的 golang 版本,在 golang 默认日志库的基础上做了更进一层的封装使得该库能更贴近日常使用。项目首页为 golang/glog,当前版本的 glog 有以下几个特点: 支持四种日志级别:INFO < WARN ... 阅读更多

实现函数 strcpy/memcpy/memmove

一、 strcpy strcpy 是字符串拷贝函数,将一个字符串拷贝到另一个字符串。 代码:

实现该函数的注意点: 传入参数 src 使用 const 修饰,避免函数内部修改数据。 使用 p 备份 dst 指针,在拷贝完成之后返回该值。 需要判断传入参数 ... 阅读更多

extern "C"语句的作用

c++中,调用 c 语言函数时要对函数添加声明 extern "C",这是因为 c 和 c++的符号表机制不一样导致的。 假设存在函数 fun,经过 gcc 编译后,该函数在符号表中的名字是 fun,但是经过 g++编译后,该函数在符号表中的结果是 xxfunxx,c++编译器会在函数两侧加上一些随机字符。因为两者的编译结 ... 阅读更多

C/C++中 struct 和 class 的区别

一、 class 和 struct 的区别 C++中 class 和 struct 的区别: 继承权限,struct 的默认继承权限为 public,class 的默认继承权限为 private 。 访问权限,struct 的默认访问权限为 public,class 的默认访问权限为 private 。 网上还流传着其他一些的区别,但 ... 阅读更多

指针和引用的区别

区别: 指针是一个变量类型,引用只是一个变量别名。 指针可以不用初始化,引用必须初始化。 指针可以指向空地址,引用不能指向空。 指针初始化后可以修改,引用不能修改。 其他: 引用本质上也是一个指针,内部实现是一个常量指针。 C++中一般建议使用引用,不要使用指针。函数传值建议使用 const 引用。