C++
文章平均质量分 62
try_again_later
在读硕士,高精度建图定位方向。
知乎专栏:《视觉、激光SLAM源码详细解析》
展开
-
C++知识点目录(都有答案)
LZ发现每天吸收的知识很多了,可是C++知识点还只是零散的,所以非常需要这样一个思维导图来给自己一个C++学习的宏观框架。希望以后可以不断补充各板块内容目录C++ Tips关键字:const、static、explcit、overridemove、指向对象的指针动态内存:allocator类内存分配、动态内存、智能指针、动态数组函数指针与函数对象boost::s...原创 2019-07-18 11:03:20 · 651 阅读 · 0 评论 -
C++ 面试知识点
BIGO原创 2019-09-03 15:41:23 · 397 阅读 · 0 评论 -
进程和线程主要区别与定义
抽象理解直接上图,CPU是工厂、电力资源是cpu 时间片、进程是车间、线程是车间工人。操作系统的资源分配与调度逻辑以多进程形式,允许多个任务同时运行;以多线程形式,允许单个任务分成不同的部分运行;提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。科学理解进程进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终原创 2020-06-28 17:33:51 · 677 阅读 · 0 评论 -
从头到尾配置最好用的Ubuntu18.04
一、重装Ubuntu系统ubuntu18.04镜像直接上图接下来到了分区界面我的120G固态硬盘模板为:选择点击“+ - Change”中的“+”:/boot:主分区,300M/:主分区,20Gswap:逻辑分区,2G/home:逻辑分区,97G除了swap的文件格式为交换空间,其余都是EXT4.大功告成。二、禁用集成显卡,只用独显我们用software-properties-gtk这个程序来安装专有的Nvidia显卡驱动。在终端里输入下面的命令打开software原创 2020-06-12 15:07:06 · 1280 阅读 · 0 评论 -
C++ STL find和find_if
find则更偏向于普通的数值或者字符比较find_if针对查找的对象中包含指针需要进行比较首先从简单的find寻找某个数值开始,其返回的是指向这个数值的迭代器。注意:需要加入#include <algorithm>头文件#include <vector>#include <algorithm>// 注意!!!#include <ios...原创 2020-03-16 15:55:31 · 424 阅读 · 0 评论 -
C++11多线程---互斥量mutex、锁lock、条件变量std::condition_variable
线程同步指线程间需要按照预定的先后顺序进行的行为线程(std::thread)和互斥量(std::mutex)中,互斥量是多线程间同时访问某一共享变量时,保证变量可被安全访问的手段。 通过条件变量。位于头文件condition_variable下condition_variable条件变量提供了两类操作:wait和notify,这两类操作构成了多线程同步。当 std::condit...原创 2020-03-14 17:50:27 · 2761 阅读 · 1 评论 -
extern关键字
1、extern用于两个或多个文件共享相同的全局变量或者函数。对于所有的程序文件是可用的。2、而且当使用extern时可以找到已经定义的变量或函数的引用。\第一个文件:int count ;int main(){ count=5;}第二个文件:extern int count ;void func(){ cout <<"count is "&...原创 2020-03-02 21:27:07 · 175 阅读 · 0 评论 -
构造函数与析构函数
一、构造函数名字与类名相同,可以有参数,不能有返回值(void也不行)作用:对对象进行初始化,给成员变量赋值。默认的构造函数无参数,不进行任何操作。对象生成时构造函数自动被调用,一旦对象生成,再也不能在其上执行构造函数。// 默认的构造函数 Sale() {}// 后面补充函数体,注意最后的; Sale();// 最常见:初始值列表,起到给数据成员赋值作用// 这...原创 2019-11-21 10:23:52 · 202 阅读 · 0 评论 -
《Effective C++》条款18-25 设计与声明
条款18 让接口容易被正常使用,不易被误用总结:1、好的接口很容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质。2、促进正确使用的方法包括接口的一致性,以及与内置类型的行为兼容。3、预防错误的方法包括创建新的类型,限定类型的操作const,约束对象的值,以及消除客户的资源管理职责。4、tr1::shared_ptr 支持自定义 deleter。这可以防止 c...原创 2018-12-18 21:01:03 · 235 阅读 · 0 评论 -
《Effective C++》条款26-31 实现
条款26 尽可能延后变量定义式的出现时间条款30 透彻了解inling的里里外外总结:1、inlining在小型、被频繁调用的函数身上,提升程序速度。2、不要只因为function templates出现在头文件,就将他们声明为inline。(1)为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。栈空间就是指放置程序的局...原创 2018-12-18 21:01:56 · 377 阅读 · 0 评论 -
《Effective C++》条款32-40 继承与面向对象设计
条款32:确定你的public继承塑模出is-a关系总结:"public继承"意味着is-a,适用于base class身上的每一件事情也一定适用于derived class身上,因为derived 也是一个 base.条款33 避免遮掩继承而来的名称总结:1、derived class内同名的名称会遮掩base class内的名称2、为了让被遮掩的名称重建天日,可使用usi...原创 2018-12-18 21:03:06 · 214 阅读 · 0 评论 -
《C++ Primer》面向对象程序设计
一、定义基类和派生类0、基本概念:class A{}class B:public A {}派生类需要通过派生类列表,明确指出它从哪个基类继承而来。 1、基类希望它的派生类各自定义适合自身的版本,在基类时将这些函数声明为virtual 虚函数。virtual 不能出现在类外部的定义 派生类需要对其内部所有重新定义的虚函数进行声明。(通过在后面加override 表明覆盖...原创 2019-01-03 23:16:08 · 146 阅读 · 0 评论 -
顺序容器和关联容器
顺序容器:vector;list;deque(双向口队列);queue(单向口队列);stack(栈 );heap(堆);priority_queue (按键值大小排序)关联容器:set;map;multiset;multimap;set和map 的insert/eraseset.insert(int x);//直接插入数值set.insert(iterator position,...原创 2019-01-08 23:00:08 · 489 阅读 · 0 评论 -
《C++ Primer》再探容器Vector、数组、String、迭代器
在编写VO程序时遇到了Vector,但是在访问时[]、()之间又遇到了问题,尤其是在想把Vector向量转化为数组时又写不出来。之前对于二者的印象只剩下了,vector是动态的,可以不断添加内容,而数组是固定的。这次最大的收获是无论vector还是数组,访问对象都只能用下标[ ],至于()是在构造对象时使用的,例如:Pointf (points1[i].x,points1[i].y);...原创 2019-01-08 14:27:50 · 195 阅读 · 0 评论 -
《Effective C++》条款13-17 资源管理
条款13 以对象管理资源原创 2018-12-18 21:00:16 · 239 阅读 · 0 评论 -
《Effective C++》条款5-12 构造/析构/赋值运算
条款 5 了解C++ 默默编写并调用哪些函数class Empty { };1、编译器会默认为空类声明copy构造函数、default构造函数、析构函数、copy assignment操作符。相当于:class Empty { public: Empty() {...}//default构造函数 Empty(const Empty& rhs) {...}//copy...原创 2018-12-18 20:59:33 · 231 阅读 · 0 评论 -
《Effective C++》1-4 const成员函数、static、确定对象使用前已先被初始化
条款1:视C++为一个语言联邦C是面向过程的语言,侧重点在于算法和数据结构。C++是面向对象的语言,侧重点在于抽象出对象模型,使模型和问题契合。区别:Class:C++中的类是C没有的,但是C中Struct在C++中也可使用;Struct成员默认访问修饰符是public,而Class默认的是Private。动态管理内存:C使用malloc/free函数,而C++除此之外还有ne...原创 2018-12-17 17:21:50 · 230 阅读 · 0 评论 -
C++中explicit的用法
C++提供了关键字explicit,即被explicit关键字修饰的类构造函数,不能进行自动地隐式类型转换,只能显式地进行类型转换。防止不必要的隐式转换。例子:#include <iostream>using namespace std;class A{public: A(int i = 5) { m_a = i; }...原创 2018-12-26 21:35:08 · 280 阅读 · 0 评论 -
vector内嵌vector
vector<vector<int> >array因为vector是一个容器,最外层的vector容器中放着更小的vector,而里层的vector里面放的是int型的数字。所以我们首先要对里层的vector容器赋值,然后再把里层的vector作为元素插入到外层的vector中。下面例子中:赋值:第一行为vec,第二行为vec_int;先对里面的vector赋值...原创 2018-12-07 21:41:56 · 1026 阅读 · 0 评论 -
Const
这里总结const出现的情况,核心:“只读”(可以使常量和变量,但不能通过你这里对他进行改变)1、顶层/底层const由于指针本身是个对象,指针所指也是一个对象,二者独立。只有指针区分顶层/底层,const char* p=greeting; //底层const,所指内容为常量,常见方式。char* const p=greeting //顶层const.指针(地址)是常量,表明不...原创 2018-11-22 10:46:19 · 192 阅读 · 0 评论 -
C++析构函数前加上virtual的原因
class A{ public: virtual void print(){cout<<"This is A"<<endl;}};class B : public A{ public: void print(){cout<<"This is B"<<endl;}}虚函数:指向基类...转载 2018-11-19 10:13:05 · 3316 阅读 · 0 评论 -
指向对象的指针
正常情况下对象一经声明就为对象的成员分配存储空间,并调用其构造函数进行初始化,对象生存期结束后自动调用析构函数,并释放对象占用的空间。缺点:造成内存紧张解决途径:先声明这些对象,在需要这些对象时才分配存储空间和调用构造函数,使用完之后可以立即调用析构函数释放其内存空间。这一途径使用C++语言指向对象的指针。先定义一个类class prince{public: void set...原创 2019-02-22 10:08:33 · 2915 阅读 · 0 评论 -
boost::shared_ptr、reserve()
下面是SVO源码中LZ读到的一句代码:global.hclass Frame{ typedef boost::shared_ptr<Frame> FramePtr;}之后调用:Frame::FramePtr frame_类似的://在类中定义智能指针class Camera{public: typedef shared_ptr<Ca...原创 2019-02-28 10:01:16 · 515 阅读 · 0 评论 -
move
vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建,move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。结果:原字符串被转移,变成空字符串。#include <iostream>#include <utility>#include <v...原创 2019-09-09 09:42:18 · 220 阅读 · 1 评论 -
继承与虚继承
允许程序员在保持原有的特性基础上进行扩展,增加功能,这样产生新的类,称作是派生类。继承呈现了面向对象程序设计的层析结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。1、定义基类:基类有两种成员函数:一种是希望其派生类进行覆盖覆盖(virtual虚函数,动态绑定),另一种是派生类直接继承而不要改变的函数。2、定义派生类:派生类继承了基类的:1)所有成员变量,包括static...原创 2019-09-03 17:29:13 · 1089 阅读 · 0 评论 -
Override关键字
描述:override保留字表示当前派生类函数重写了基类的虚函数。使用override有助于防止代码中出现意外的继承行为。目的:1、强制编译器检查某个函数是否覆盖成功,否则报错 2、函数多的时候提醒读者某个函数重写了基类虚函数形式:Struct B{ virtual void f1(int) const; virtual void f2();};struct...原创 2019-09-03 16:45:36 · 222 阅读 · 0 评论 -
BIGO 面经C++总结
1、C++和C语言最大的区别是什么大体上:C是面向过程的语言,而C++是面向对象的语言。面向过程:类调用时需要实例化,开销比较大,单片机、嵌入式开发。面向对象:封装、继承、多态,易维护、易复用、易扩展C++更是拓展了面向对象设计的内容,如类Class、继承、虚函数等、以及一个非常强大的C++标准模板库STL,另外一个Boost库现在也归属C++标准库。具体:1)动态内存管理:C...原创 2019-09-03 16:14:36 · 1410 阅读 · 0 评论 -
STL lower_bound, upper_bound
总结:1、用之前先用sort排好序2、想要得到找到数字在数组中的下标,通过返回的地址减去起始地址begin,int t1 = lower_bound(board,board+5,3)-board;3、lower_bound:是第一个大于等于;upper_bound:是第一个大于,不包含int x.lower_bound( )和upper_bound( )都是利用二分查找的方法...原创 2019-07-18 22:24:48 · 161 阅读 · 0 评论 -
C++ 11 :"emplace_back" 和 "push_back" 的区别
emplace_back和push_back都是向容器内添加数据.对于在容器中添加类的对象时, 相比于push_back,emplace_back可以避免额外类的复制和移动操作.因为emplace_back只调用构造函数,没有移动构造函数,也没有拷贝构造函数。#include <vector>#include <string>#include <io...转载 2019-07-18 14:43:43 · 169 阅读 · 0 评论 -
vector的erase()
erase的函数原型有两种形式:iterator erase(iterator position);//删除单个位置iterator erase(iterator first, iterator last);//删除一段在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素...转载 2019-04-02 10:38:05 · 14909 阅读 · 5 评论 -
VS2013配置Eigen+Opencv
打开项目属性,C++ -> 附加目录,添加刚才eigen的存放路径。 (暂时需要每次都配置)Eigen:https://blog.csdn.net/u012428169/article/details/71169546Opencv:https://blog.csdn.net/beyond_2016/article/details/81359762...转载 2019-04-05 10:29:46 · 418 阅读 · 0 评论 -
C++异常处理
写在前面:程序运行时常会碰到一些异常情况,例如:做除法的时候除数为 0; 用户输入年龄时输入了一个负数; 用 new 运算符动态分配空间时,空间不够导致无法分配; 访问数组元素时,下标越界;打开文件读取时,文件不存在。这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃。但是也不能一出现问题就进行处理,最好的思路是在发生各种异常时让程序都执行到同一个地方,这个地方能够对异常...原创 2019-03-12 21:18:35 · 311 阅读 · 0 评论 -
pair、boost::bind、sort
下面是SVO源码中LZ读到的一句代码:close_kfs.sort(boost::bind(&std::pair<FramePtr, double>::second, _1) <boost::bind(&std::pair<FramePtr, double>::second, _2)); 分为三部分介绍:pair, boost::bind, ...原创 2019-02-26 15:27:07 · 284 阅读 · 0 评论 -
static关键字总结
一、static两个作用:1、限定作用域(隐藏) 2、保持变量内容持久化1、限定作用域(隐藏)//a.cchar a = 'A'; // 全局变量void msg() //全局成员函数{ printf("Hello\n");}//main.cint main(){ extern char a; // 调用全局变量 printf("%c ...原创 2019-02-26 10:12:27 · 411 阅读 · 0 评论 -
lambda表达式
LZ遇到的SVO代码为:initialization.cppfor_each(new_features.begin(), new_features.end(), [&](Feature* ftr){ px_vec.push_back(cv::Point2f(ftr->px[0], ftr->px[1])); f_vec.push_back(ftr-&g...原创 2019-02-25 10:05:35 · 220 阅读 · 0 评论 -
ORB-SLAM2中的C++技巧(一)
打算好好啃ORB-SLAM源代码,接下来的LSD、SVO其实就是从特征点法换成了光流法(直接法),但是整体的框架大同小异,所以打算两周时间啃完,并将学习到的C++技巧总结下来,这样对于C++也会有新的理解。每章5个技巧,怕什么真理无穷,进一寸有进一寸的欢喜。一、多线程Thread并发:某一个时刻只能处理一个操作,但是交替进行。大脑的设计:看显示器同时打字并行:某个时间点上处理两...原创 2018-11-09 10:09:31 · 1602 阅读 · 1 评论 -
25-30 运算符重载、赋值运算符重载、运算符重载为友元函数、流插入和提取运算符重载
一、运算符重载扩展C++中提供的运算符适用范围,以用于类所表示的抽象数据类型运算符重载实质是函数重载运算符重载是成员函数时,a+b的 a.operator+b,a 相当于对象,只传入后面的参数class A{public: A(double r = 0.0, double i = 0.0) :real(r), imag(m) {};//构造函数,初始值列表 A operator+ (con...原创 2018-04-13 09:48:46 · 805 阅读 · 0 评论 -
类与对象编程(POJ C++ 第三周)
1、类名::成员名(范围解析运算符,之前必须是类)A::printtotal2、对象名.成员名(.之前必须是对象名)A aa.printtotal()3、指针->成员名A *p = &r;p->printtotal()4、引用.成员名A &ref=r 3w7、描述下面程序输出的结果是:05请填空: #in...原创 2018-04-11 20:20:32 · 357 阅读 · 0 评论 -
课后作业
6.3 编写自己的fact函数#include<iostream>#include<string>#include<vector>using namespace std;string fact(char trueanswer){ switch (trueanswer) { case 'A'://这里是冒号 return "wrong ans...原创 2018-03-28 22:14:47 · 121 阅读 · 0 评论 -
20-24(静态成员变量、函数、成员对象、封闭类、this指针、常量对象、常量成员函数、常量引用)
一、静态成员变量与静态成员函数设置静态成员目的是将和某些类紧密相关的全局变量和函数写到类里面,看上去像一个整体。//访问静态成员//静态成员并不只属于某个对象,本质上全局变量//1、类名::成员名rectangle::printtotal();//2、对象名.成员名rectangle r;r.printtotal();//3、指针->成员名rectangle *p = &r原创 2018-04-10 10:41:49 · 467 阅读 · 0 评论