C++笔记

3 篇文章 0 订阅
1 结构体

定义一个默认构造函数,可以使用emplace_back()函数直接进行压入操作,避免push_back()函数时,申请临时对象的系统资源的浪费;

	typedef struct _Info                //定义结构体时要给一个默认构造函数
	{
		std::string type;
		uint8_t r;
		uint8_t g;
		uint8_t b;
		_Info(const std::string& t, uint8_t _r, uint8_t _g, uint8_t _b)   // 传引用的方式可以少一次复制 
		{
			type = t;
			r = _r;
			g = _g;
			b = _b;
		}
	}Info;
 vector<Info> Infos;  					 //定义一个Info类型的向量
 Infos.emplace_back(point,255, 0, 0);   //就地压入(默认调用我定义的结构体的构造函数)
2 unorder_map

头文件:

 #include <unordered_map>

定义一个map: std::unordered_map<int, size_t> map; // 用int型来索引size_t类型
unordered_map<第一变量类型, 第二变量类型> 变量名; //第一变量索引第二变量
例如: 插入操作:直接用 [ ]
此处id为第一变量 key;cloud.points.size()为第二变量;

map[ id ] = cloud.points.size();                  // key值为障碍物的id;对应的编号为此时的数据长度

if(map.find(obj_id) != map.end())                 //先要检测一下存在不存在,如果不存在则会默认给一个东西插进去
{
    auto &point = cloud->points[map[obj_id]];     //此处的map[obj_id]相当于i 
    point.r = Infos[obj_type].r;
    point.g = Infos[obj_type].g;
    point.b = Infos[obj_type].b;
}
3 size_t:无符号整型

不同平台的size_t会用不同的类型实现,使用size_t而非int或unsigned可以写出扩展性能更好的代码;为移植性服务的
比如long型变量在32为和64位电脑上的字节长度就不一致了 前者为4,后者为8
32位系统是32位无符号整形,64位系统是64位无符号整形

4 for(int i : a)

表示将数组a中的元素依次赋给i;

5 智能指针

c++中动态内存的管理是通过new和delete来完成的,只要保证new和delete的配对使用,是没有问题的。但是有时候我们会忘记释放内存,甚至有时候我们根本就不知道什么时候释放内存。特别时在多个线程间共享数据时,更难判断内存该何使释放。这种情况下就机器容易产生引用非法内存的指针;
初始化 shared_ptr<string> point(new string("normal usage!"))

shared_ptr<pcl::PointCloud<pcl::PointXYZRGB>> cloud (new pcl::PointCloud<pcl::PointXYZRGB>)
6 栈

栈的声明:stack<T> s; T代表数据类型 example:stack<char> s;
遍历栈中的元素:

while(!s.empty()){		   // 判断栈是否为空 
    cout << " " << s.top();    // 取出顶部元素
    s.pop();	           // 删除顶部元素
}
7 文件指针

C++标准库<stdio.h>里面定义了FILE的结构体
FILE* fp 定义了一个文件指针的意思
fopen函数是在C语言里面定义的,其函数的原型是 fopen(const char* , 'w')有两个传入参数。第一个参数是const char*型的,如果想将string型的传给fopen则需要使用c_str()string转化为const char*型的;
第二个参数:
1."r" = "rt"
  打开一个文本文件,文件必须存在,只允许读
2."r+" = "rt+"
  打开一个文本文件,文件必须存在,允许读写
3."rb"
  打开一个二进制文件,文件必须存在,只允许读
4.“rb+”
  打开一个二进制文件,文件必须存在,允许读写
5."w" = “wt”
  新建一个文本文件,已存在的文件将被删除,只允许写
6."w+" = "wt+"
  新建一个文本文件,已存在的文件将被删除,允许读写
7.“wb”
  新建一个二进制文件,已存在的文件将被删除,只允许写
8.“wb+”
  新建一个二进制文件,已存在的文件将被删除,允许读写
9."a" = "at"
  打开或新建一个文本文件,只允许在文件末尾追写
10."a+" = "at+"
  打开或新建一个文本文件,可以读,但只允许在文件末尾追写
11.“ab”
  打开或新建一个二进制文件,只允许在文件末尾追写
12.“ab+”
  打开或新建一个二进制文件,可以读,但只允许在文件末尾追写
代码示例:
fp = fopen((file_path_+file_name_).c_str(),"w"); //新建一个文本文件,已存在的文件将被删除,只允许写

8 fflush()函数

刷新流 stream 的输出缓冲区,flush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。

9 unorderedatoi()atoi()_set

头文件为:#include<unorder_set>
可以看成这个用途是定义一个集合:unordered_set<char> occ // 定义一个char型的集合
因为这个容器存储类似一个集合:所以插入同样的字符是没用的(即插入多个同样的只会默认保存一次)
其中的count函数;只会返回1,0;对于count(x);若定义的集合中存在x,返回1,反之,返回0

10 sign符号函数

sign(n) 取n的符号

11 c_str()函数atoi()

在c语言中没有string类,C++中string类向字符串转化用到的函数为:c_str()

string s = "Hello";
printf("%s",s.c_str());
12 atoi()函数

int atoi(const char *str)把参数str所指向的字符串转换为一个整数;
头文件: #include <stdlib.h>

13 定义向量,并输出向量中的最小值
头文件:
#include <vector>
#include <algorithm>
std::vector<init> list;
*min_element(list.begin(), vlist.end());
14 将向量反转
头文件:
#include <vector>
#include <algorithm>
reverse(trianglePoints.begin(), trianglePoints.end());
15 每次push()进去一组向量后,下一时刻需要clear()
16 枚举类型
enum GpsState 
{
	NONE = 0, 
	FIXEDPOS = 1, 
	FIXEDHEIGHT = 2, 
	DOPPLER_VELOCITY = 8, 
	SINGLE = 16,
	PSRDIFF = 17,
	SBAS = 18,
	L1_FLOAT = 32,
	IONOFREE_FLOAT = 33,
	NARROW_FLOAT = 34,
	L1_INT = 48,
	WIDE_INT = 49,
	NARROW_INT = 50
};
17 C++大端小端转换函数
  • 一般计算机默认存储模式为:小端模式补码形式

  • 字节序转换接口:

h代表的是主机字节序(小端字节序)类型,n代表的是网络字节序(大端字节序) ,s代表short类型,l代表long类型(4字节)。

ntohs: “Network to Host Short” ntohl: “Network to Host Long” htons:
“Host to Network Short” htonl: “Host to Network Long”

将网络字节序转换为主机字节序(也就是大端字节序转换为小端字节序): ntohs() 、 ntohl()
将主机字节序转换为网络字节序(也就是小端字节序转换为大端字节序): htons()、 htonl()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人生不过一闭一睁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值