C/C++
文章平均质量分 69
椛茶
音视频,RTC,后端开发,C++,golang
展开
-
getopt函数讲解
一. 前言 当我们编写好一个应用程序,经常需要添加一些命令行选项以支持不同的场景。假设我们编写了一个可以以指定方式连接到其他主机端口的应用程序 connect,我们可以执行 ./connect -m tcp -s 192.168.1.105 -p 8888 表示要以 tcp 方式连接到主机名为 192.168.1.105 的 8888 端口,这样你的程序不会被写死,当你需要连接到...原创 2019-07-28 22:46:43 · 1017 阅读 · 0 评论 -
C++ 标准库迭代器概念与分类
一. 前言 C++ 标准库提供了许多容器,如 list,vector,deque 等,同时标准库还提供了一种方便程序员遍历访问 STL 的手段,例如我们可以使用下标的方式来访问 vector 容器,但是对于 list 容器,显然用下标来遍历访问不太合理。vector<int> vec = {1,2,3,4,5,6,7};for(decltype(vec.siz...原创 2019-08-18 23:47:47 · 384 阅读 · 0 评论 -
C++打印multimap中某个key对应的所有value
由于 multimap 允许存在重复的key,所以我们不能直接通过下标运算符或者 at 函数来打印 multimap 某个 key 对应的所有value 值。下面介绍三种方式打印出 multimap 某个 key 对应的所有值。1. 使用find和count成员函数#include <iostream>#include <map>#i...原创 2019-08-23 00:34:24 · 2887 阅读 · 1 评论 -
为什么迭代器比较是否结束的时候使用!=而不是使用<
我们经常看到遍历容器的操作,例如遍历打印一个 vector,我们可以使用迭代器的方式,如下代码所示。vector<int> vec = {1,2,3,4,5,6,7};for(auto it = vec.begin();it != vec.end();++it){ cout << *it << " ";} 那...原创 2019-08-23 00:48:17 · 1275 阅读 · 1 评论 -
继承中的static成员变量和成员函数探究
我们知道:子类在继承父类时拥有父类的所有成员,子类可以访问父类的属性和方法(父类中private权限修饰的无法访问),那么对于父类中的静态成员变量和静态成员函数的继承结果是怎么样的呢?1.继承中的静态成员变量子类可以继承使用父类的 static 变量,可以使用 Child::num 去获取,但是注意此时跟 Parent::num 其实是同一个内存地址空间的变量,因此不能在定义的时...原创 2019-03-05 23:24:08 · 1104 阅读 · 0 评论 -
为什么不要重载&&,||操作符
&&,|| 是一种逻辑运算符,它内置实现了短路原则,比如 condition1 && condition2,如果 condition1 不满足,那么 condition2 的值将不会得到计算,同理如果condition1 || condition2,当condition1 为真时,condition2 的值也不会得到计算。为什么不要重载逻辑与,逻辑或运算符?...原创 2019-03-05 23:31:33 · 347 阅读 · 0 评论 -
C++智能指针
一. 智能指针 在 C++ 中,我们申请内存一般使用 new,释放内存时使用 delete,但是有时候我们可能由于疏忽会忘记 delete,或者当程序有多个出口时,也会容易有 new 没有 delete,这样就产生了内存泄漏,如果你的程序是一个需要长期运行的服务器程序,可能运行着几天突然程序就崩溃了,原因也不好定位,所以为了方便内存管理,C++ 引入了智能指针,智能指针的优点在于...原创 2019-03-13 22:59:05 · 1550 阅读 · 2 评论 -
C++ boost库介绍以及开发环境搭建
boost 库是一个优秀的,可移植的,开源的 C++ 库,它是由 C++ 标准委员会发起的,其中一些内容已经成为了下一代 C++ 标准库的内容,在 C++ 社区中影响甚大,是一个不折不扣的准标准库,它的功能十分强大,弥补了 C++ 很多功能函数处理上的不足。原创 2019-03-24 18:10:54 · 12224 阅读 · 0 评论 -
hpp文件介绍
什么是hpp文件 以往在编写 C++ 程序时,如果需要分模块,一般我们是编写一个 .h 文件,在里面放上函数的声明,再编写一个 .cpp 文件,在里面添加函数的相关实现,这样子在使用的时候包含头文件,再把 .cpp 加到当前工程下编译即可,如果此时 .cpp 忘记添加到当前工程下编译,经常就会出现函数找不到的情况。如果你的 .h 是模板类的声明,.cpp 是模板类函数的实现,由于...原创 2019-03-24 18:20:02 · 27674 阅读 · 0 评论 -
数值转换lexical_cast的使用
1.C语言中的数值类型转换在 C 语言中提供了几个标准库函数,可以将字符串与整型,浮点型等进行转换。atof() 将字符串转换为双精度浮点型值atoi() 将字符串转换为整型值atol() 将字符串转换为长整型值itoa() 将整型值转换为字符串gcvt() 将浮点数类型值转换为字符串 ...原创 2019-03-24 23:04:39 · 2267 阅读 · 1 评论 -
格式化处理format
1.C/C++的格式化处理 在字符串处理中少不了格式化字符串,C 语言中传统的格式化处理函数是 printf,snprintf,但是存在的问题是使用上不安全,如果格式符使用不当容易造成意想不到的后果,C++ 中虽然提供了 stringstream 来实现安全的格式化,但是使用上不如 snprintf 直观。C语言格式化:printf("%s %d %c","hello",12...原创 2019-03-24 23:46:35 · 543 阅读 · 0 评论 -
禁止拷贝和赋值noncopyable
1.背景介绍 在 C++ 定义一个类后,有时候我们可能不需要这个类的对象被拷贝(即拷贝构造和通过赋值符号构造),这时候我们通常的做法是将该类的拷贝构造函数和重载的 operator= 函数声明为 private 属性,这样用户就不可以调用该类的拷贝构造函数和赋值构造函数了。但是经常这样做比较麻烦,每次都要定义一个拷贝构造函数和重载 operator= 函数并且设置为 privat...原创 2019-03-29 23:27:24 · 369 阅读 · 0 评论 -
C++ string的介绍
一. 简介 在 C 语言中如果想要定义一个字符串一般是通过定义char * 或者 char 类型数组来实现,这种 char * 或者 char 数组很容易造成非法内存访问的问题,在 C++ 标准库中有一种可变长字符串类型 string,它可以帮助我们更加方便地定义以及使用字符串。使用前需要包含头文件 <string>,注意不是 <string.h> 后者...原创 2019-04-01 22:11:21 · 491 阅读 · 2 评论 -
auto关键字的作用
1.前言 在 C 语言以及 C++98 时代,auto 关键字的作用并不大,仅用于声明变量是自动类型的变量,具有自动存储期,这种类型的变量在进入变量声明的程序块中才被建立,程序退出程序块时该变量就被撤销,在函数内部定义的变量具有自动变量的属性。void func(){ int num = 0; // num 就是一个自动类型的变量,实际上等...原创 2019-05-26 16:38:17 · 8751 阅读 · 0 评论 -
可变参数函数及其实现方式
一. 什么是可变参数函数 如果你接触 C 语言,那你一定不会对 printf 函数感到陌生,比如使用 printf("%d + %d= %d\n", a, b, a + b) 打印变量 a 和 b 相加的结果,也可以直接使用 printf("Hello, Meng bie ting\n") 往屏幕上输出字符串,printf 函数就是一个可变参数函数,第一个参数可以看做是一个格式化说...原创 2019-07-25 23:32:23 · 2116 阅读 · 1 评论 -
C++ vector容器的介绍
一. 简介 在 C 语言中如果想要定义同一类型的元素序列,可以使用数组来完成。例如 int num[10] = {1,2,3,4,5,6,7,8,9,10} 代表定义了一个大小为 10 的,存放 int 类型对象的数组。使用数组的不足显而易见:在定义的时候必须初始化一个大小,如果在使用的过程中发现这个数组大小不足,也无法对这个数组扩容;如果一开始将数组定义得很大,又容易造成空间的...原创 2019-08-30 00:29:08 · 1195 阅读 · 0 评论