
c++
文章平均质量分 68
C++一些具体的知识点
他人是一面镜子,保持谦虚的态度
别低头,王冠会掉;别流泪,坏人会笑
展开
-
int main(int argc, char *argv[])中的 argc, *argv[] 解析
转载 2024-05-20 20:26:14 · 1187 阅读 · 1 评论 -
C++:保存char、int 和double到txt文件
C++:保存char、int 和double到txt文件原创 2022-09-28 23:17:10 · 1558 阅读 · 0 评论 -
C++ 读取【指定字符串头】的.DAT数据文件,并保存到txt文件中(绝对正确)
比如,.DAT文件的格式如下:我想读取数据流头为 $PSNSR 一行的数据,其他的数据都不要!代码如下:#include <iostream>#include <iomanip>#include <string.h>#include <fstream>#include <math.h>#include <string>#include<sstream>#include <stdli.原创 2022-03-30 18:39:56 · 2920 阅读 · 1 评论 -
char 数组 解析
1、声明如下是一个例子(=> 表示表达式等价):char a[20] = "abcd";char b[] = "abcd"; // => char b[5] = "abcd"; const char c[] = "abcd";char *d = "abcd"; // => const char d[] = "abcd";const char *e = "abcd"; // => const char e[] = "abcd"; char转载 2022-02-28 14:57:42 · 15638 阅读 · 0 评论 -
C++中free()与delete的区别
new/delete 是C++的操作符,而malloc/free是C中的函数。 new做两件事,一是分配内存,二是调用类的构造函数;同样,delete会调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。 new建立的是一个对象,而malloc分配的是一块内存;new建立的对象可以用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,用指针访问,可以在里面移动指针;new出来的指针是带有类型信息的,而malloc返回的是void指针。 new/delete是.转载 2022-02-06 17:53:29 · 539 阅读 · 0 评论 -
c++11:多线程编程(8)死锁问题
看到 “死锁” 二字,你是不是慌得不知所措。死锁,顾名思义就是这个锁死掉了,再也动不了了。那死锁是怎么产生的呢?当你对某个资源上锁后,却迟迟没有释放或者根本就无法释放,导致别的线程无法获得该资源的访问权限,进而程序无法运行下去,有点像是阻塞的现象。但是阻塞是一种正常现象,而死锁可以说是一种bug,必须要处理。那么我现在就举个死锁的例子,来分析分析。#include <iostream>#include <thread>#include <mutex>usi转载 2021-09-18 13:21:57 · 257 阅读 · 0 评论 -
c++11:多线程编程(7)信号量的实现
一、为何需要信号量信号量用来干嘛的呢?搜寻答案的话,很多人都会告诉你主要用于线程同步的,意思就是线程通信的。简单来说,比如我运行了2个线程A和B,但是我希望B线程在A线程之前执行,那么我们就可以用信号量来处理。有些人可能会疑惑,那么麻烦干嘛?你不是要B线程先执行吗?那么我让A线程休眠一点时间不就可以了吗?没错,这个思路是可以的,但是如果B线程也因为某些原因(比如硬件,操作系统的原因)导致延缓执行了,这该怎么办?到底A线程该休眠多少时间合适呢?所以正确的做法就是在B线程阻塞,A线程去唤醒这个阻塞线程。转载 2021-09-18 12:57:28 · 378 阅读 · 0 评论 -
c++11:多线程编程(6)线程池的实现
学一门新技术,还是要问那个问题,为什么我们需要这个技术,这个技术能解决什么痛点。一、为何需要线程池那么为什么我们需要线程池技术呢?多线程编程用的好好的,干嘛还要引入线程池这个东西呢?引入一个新的技术肯定不是为了装逼,肯定是为了解决某个问题的,而服务端一般都是效率问题。我们可以看到多线程提高了CPU的使用率和程序的工作效率,但是如果有大量的线程,就会影响性能,因为要大量的创建与销毁,因为CPU需要在它们之间切换。线程池可以想象成一个池子,它的作用就是让每一个线程结束后,并不会销毁,而是放回.转载 2021-09-18 12:02:43 · 216 阅读 · 0 评论 -
c++11:多线程编程(5)生产消费者模型之条件变量
当某个线程持有这把锁的时候(就是所谓的加锁),那么这个线程是独占所有的资源,这里的资源指的是执行的权限,其他要抢夺资源的线程都不得不等待。在很多情况下,这都容易适用,但是有些情况下,却会产生一些异常情况。 在生产消费者模型当中,肯定都会用到互斥锁的机制的,当生产者往队列中放数据的瞬间,消费者是不能取数据的,那这时候可能会碰见一个问题,如果生产者因为某些原因,放数据过慢,但是消费者取数据很快,当队列中没有数据了,消费者还去取的话,就会发生异常情况。有些人可能会说,加个条件判断一下队列是否为空...转载 2021-09-18 11:37:14 · 293 阅读 · 0 评论 -
c++11:多线程编程(4)原子操作
今天和大家说说C++多线程中的原子操作。首先为什么会有原子操作呢?这纯粹就是C++这门语言的特性所决定的,C++这门语言是为性能而生的,它对性能的追求是没有极限的,它总是想尽一切办法提高性能。互斥锁是可以实现数据的同步,但同时是以牺牲性能为代价的。口说无凭,我们做个实验就知道了。我们将一个数加一再减一,循环一定的次数,开启20个线程来观察,这个正确的结果应该是等于0的。先是不加任何互斥锁同步#include <iostream>#include <thread>.转载 2021-09-18 10:30:31 · 243 阅读 · 0 评论 -
c++11:多线程编程(3)lock_guard和unique_lock
如果熟悉C++多线程的童鞋可能有了解到实现的互斥锁的机制还有这个写法lock_guard<mutex> guard(mt);那么这句话是什么意思呢? 为什么又要搞个这样的写法呢?这个也是构造互斥锁的写法,就是会在lock_guard构造函数里加锁,在析构函数里解锁,之所以搞了这个写法,C++委员会的解释是防止使用mutex加锁解锁的时候,忘记解锁unlock了。#include <iostream>#include <thread>#incl.转载 2021-09-18 10:17:42 · 273 阅读 · 0 评论 -
c++11:多线程编程(2)互斥锁mutex用法
还是那个问题,编程世界中学习一个新的技术点,一定要明白一件事,为什么要出现这个技术点,只有弄懂了这个才能从根本上有学习的动力。那么为什么要出现多线程锁这个东西呢?一句话概括的话。为了保证数据的准确性!计算机就是为了计算数据才诞生的,如果不能保证数据准确的话,任何技术都只是空中楼阁,多线程技术也是一样,那么为什么多线程会让数据不准确呢?大家可以看下以下的这个例子:#include <iostream>#include <thread>#include <转载 2021-09-18 09:48:28 · 148 阅读 · 0 评论 -
深入理解 C++ 中 std::chrono的时钟Clock
std::chrono是C++11引入的日期时间处理库,其中包含3种时钟:system_clock steady_clock high_resolution_clock近来需要使用高精度时间,很自然想到使用high_resolution_clock,然而使用后发现并非预期的得到自1970/1/1零点之后的计数,而是一个小得多的数字。那么这三种时钟有什么区别,用在什么情况下,我们来一探究竟。一、问题auto tp = std::chrono::high_resolution_c.转载 2021-09-16 21:23:03 · 5941 阅读 · 0 评论 -
C++11 多线程编程之条件变量std:: condition_variable、wait()、notify_one()、notify_all()
1 为何引入条件变量解决while不断循环收发消息,让它只有消息到来时才进行处理。大大减少CPU的使用率和提高程序效率; 在多线程编程中,当多个线程之间需要进行某些同步机制时,如某个线程的执行需要另一个线程完成后才能进行,可以使用条件变量; c++11提供的 condition_variable 类是一个同步原语,它能够阻塞一个或者多个线程,直到另一线程修改共享变量并通知 condition_variable。也可以把它理解为信号通知机制,一个线程负责发送信号,其他线程等待该信号的触发。原创 2021-08-21 22:19:48 · 2698 阅读 · 1 评论 -
C++多线程中的互斥量、锁
一、简介多线程同时访问公共变量时,必须对变量进行保护,避免同时的“写-写”和“读-写”访问,但变量本身是无法被保护的,毕竟变量只是一段可读写的内存区域而已。于是,我们定义了一种新的变量 —— 互斥量//mutex,这是一种可以被保护的量。互斥量是一种同步原语,是一种线程同步的手段,用来保护多线程同时访问的共享数据. std::mutex: 独占的互斥量,不能递归使用. std::timed_mutex: 带超时的独占互斥量,不能递归使用. std::recur...原创 2021-08-20 11:04:42 · 900 阅读 · 0 评论 -
c++11:多线程编程(1)初识
一、线程与进程计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。 进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。 一个车间里,可以有很多工人,他们协同完成一个任务。线程就好比车间里的工人,一个进程可以包括多个线程。 车间的空间是工人们共享的,比如许多房间是每个工人都原创 2021-08-20 10:35:56 · 464 阅读 · 0 评论 -
C++中的continue、break、return的区别
一、continue终止当前的循环过程(后面的程序不再执行),但他并不跳出循环(继续执行循环语句)二、breakbreak在循环体内,终止循环,继续while后面的代码 当break出现在循环体中的switch语句体内时,其作用只是跳出该switch语句体。三、return return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行。 return 返回一个值给调用该方法的语句,返回值的数据类型必须与方法的声明中的返回值的类型一致。 return后...原创 2021-07-23 20:36:46 · 820 阅读 · 0 评论 -
C++中 仿函数简单介绍
仿函数,顾名思义,就是“仿造函数”的意思,它并不是函数,但是却有着类似于函数的行为。那么,它到底是什么?首先要说的是:仿函数是泛型编程强大威力和纯粹抽象概念的又一个例证。我们在C++最早接触泛型编程的恐怕是在学模板(template)的时候,它具有可以任意指定类型的特点。仿函数也具有这个特点,这也充分体现出来仿函数灵活性的特点。一、仿函数的概念我们在编程的时候,有时候会发现这样一种情况:有一些相同的功能,会在不同的成员函数中出现。这时候按照一般的技巧,我们会将这些相同的功能独立出来进行封装.转载 2021-03-20 14:42:34 · 2151 阅读 · 1 评论 -
C++ 使用查询网站
https://en.cppreference.com/w/原创 2020-11-21 11:21:51 · 374 阅读 · 0 评论 -
printf格式化输出
一、转换说明符 %a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99) %c 字符%d 有符号十进制整数 %f 浮点数(包括float和double)%e(%E) 浮点数指数输出[e-(E-)记数法] %g(%G)浮点数不显无意义的零"0" %i 有符号十进制整数(与%d相同...原创 2020-11-20 21:01:38 · 196 阅读 · 0 评论 -
C++ 中 时间文件的读取
一、文件格式timestamps.txt 如下:二、程序int main(int argc, char** argv){ ros::init(argc, argv, "vins_estimator"); ros::NodeHandle n("~"); ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Info); if(argc != 3) { printf(.原创 2020-11-18 22:06:11 · 896 阅读 · 0 评论 -
C++ 中读取和保存 .txt文件 详细教程
一、读取指定文件夹中的 txt 文件, 并保存到数组中1.1、包含的头文件#include <iostream>#include <fstream>int main(int argc, char **argv){ double in[1000][4]; //定义数组 Eigen::MatrixXd aa(1000,4) ; //这里需要包含Eigen3库 //从文件读入到数组 ifstream fin("D://chengxu...原创 2020-07-15 22:19:39 · 5352 阅读 · 0 评论 -
文件读取Config类
前言: 写一个负责参数读取的类Config,能够只更改default.yaml内容即可,无需在程序内部更改。获取相机参数:myslam::Config::setParameterFile("default.yaml");double fx=myslam::Config::get<double> ("Camera.fx");直接调用类中成员函数,需要static静态成员函数。...转载 2020-04-06 20:38:34 · 346 阅读 · 0 评论 -
关于编译报错 error: cannot convert ‘const std::__cxx11::basic_string‘ to ‘const char*‘ 的处理
所以然目前c++11标准开始普及,大家都开始默认支持或者使用c++11,例如GCC 5就开始默认启用C++11特性。但是由于c++11相对于c++03,很多实现的数据结构都发生了改变,所以两者并不能完全混用。默认情况下,GCC 5在编译时会将std::string类型按c++11下std::__cxx11::basic_string 来处理,这时如果你调用的库在编译时未启用c++11特性则其中...转载 2020-04-25 16:30:42 · 12303 阅读 · 0 评论 -
i ++ 和 ++ i 的区别
一、记忆法前++ 是先自加再使用;后++ 是先使用再自加!二、实例2.1 后++a = j++;等效为:a = j;j = j + 1;2.2 前++a = ++j;等校为j = j + 1;a = j;原创 2020-11-10 18:14:12 · 96 阅读 · 0 评论 -
C++中 #ifdef 和 #endif
一、说明程序中,我们有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”; 有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译命令最常见的形式为:#ifdef 标识符程序段1#else程序段2#endif作用:当标识符已经被定义过(一般是用 #define 命令定义),则对程序段1进行编译,否则编译程序段2。其中#else部分也可以没有,即:#ifdef 标识符程序段1#d...原创 2020-11-10 17:01:21 · 350 阅读 · 0 评论 -
c++ queue的简单用法
一、定义queue<类型> 名称;例如:queue<int> q1; queue<double> q2; queue<float> q3二、基本操作 que.front() // 取队首元素 que.back() // 取队尾元素 que.push(x ) // 将元素x入队,从已有元素后面增加元素 que.pop() // 将队首元素出队 que....原创 2020-11-05 10:12:58 · 1488 阅读 · 1 评论 -
C++ 中vector基本用法及其insert()、begin()、end()、front()与back()的用法详解
一、C++ 中vector的使用方法vector是C++标准模板库(STL)中的部分内容,是一个十分有用的容器,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。特别注意:使用vector需要注意以下几点:1、如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;2、Vector作为函数的参数或者返回值时,需要注意它的写转载 2020-10-19 21:14:28 · 7594 阅读 · 0 评论 -
C++数字转string,string转数字函数总结
包含头文件:string.h一、数字转string,这些都可以std::to_string(int)std::to_string(long)std::to_string(long long)std::to_string(float)std::to_string(double)std::to_string(long double)#include<bits/stdc++.h>using namespace std;int main(){ int.原创 2020-10-12 21:48:37 · 5166 阅读 · 0 评论 -
c++ vector使用 最全整理
vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.用法:1.文件包含:首先在程序开头处加上#include以包含所需要的类文件vector还有一定要加上using namespace std;2.变量声明:2.1 例:声明一个int向量以替代一维的数组:vector a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。2.2 例:用vect转载 2020-09-18 16:03:52 · 431 阅读 · 0 评论 -
C++ map简单用法
1,map简介map是STL的一个关联容器,它提供一对一的hash。第一个可以称为关键字(key),每个关键字只能在map中出现一次; 第二个可能称为该关键字的值(value);map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的,后边我们会见识到有序的好处。比如一个班级中,每个学生的学号跟他的姓名就存在著一对原创 2020-09-18 15:52:27 · 467 阅读 · 0 评论 -
C++ main函数中参数argc和argv含义及用法
概述argc 是 argument count 的缩写,表示传入main函数的参数个数;argv 是 argument vector 的缩写,表示传入main函数的参数序列或指针,并且 第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径,所以确切的说 需要我们输入的main函数的参数个数应该是 argc-1 个;示例,新建工程键代码:#include <iostream> using namespace std; void main(int a.转载 2020-09-16 19:01:54 · 399 阅读 · 0 评论 -
C++程序设计 课堂笔记
https://blog.youkuaiyun.com/qipeng_master/article/details/88124357原创 2020-07-17 21:43:16 · 465 阅读 · 0 评论 -
C++——std::String
string::string// string constructor#include <iostream>#include <string>int main (){ std::string s0 ("Initial string"); //根据已有字符串构造新的string实例 // constructors used in the same or...原创 2020-04-10 07:55:19 · 351 阅读 · 0 评论