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()