C++
文章平均质量分 87
一些常用的C/C++使用说明
碎步の流年
这个作者很懒,什么都没留下…
展开
-
C++ std::move和std::forward
首先奉上大神的链接,再次膜拜。此篇文章有些例子参考的大神的文章,在此说明。背景这篇文章是继续上一篇左值右值的文章,上一篇文章主要说明了左值右值使用可以带来的的算力优化。这一篇,重点则是,如何将左值右值在实际项目中使用起来。C++ 传值的方式默认是拷贝,而且临时变量拷贝的算力开销很大,在此背景下,诞生了左值和右值的概念,就是为了避免临时变量的拷贝开销。举个例子:function("some temporary value"); // 直接传入string,可能有string的复.原创 2021-09-23 15:38:20 · 663 阅读 · 0 评论 -
C++左值和右值,左值引用和右值引用
左值和右值C++ 中对于左值和右值没有一个标准的定义,通常来说:可以取得到地址的,有变量名称的,非临时的量就是左值,从硬件结构上看,存储在内存中的量就是左值;无法取得到地址的,没有变量名称的,临时的量就是右值,从硬件结构上看,存储在寄存器中的量就是右值。左值引用常见的左值引用如下:int a = 1;int &b = a; // 定义一个左值引用变量b = 2; // 通过左值引用修改引用内存的值左值引用在汇编层面其实和普通的指针是一样的;定义的左值引用原创 2021-09-22 16:09:28 · 490 阅读 · 1 评论 -
C和C++ 常用格式化输出方式
调试的时候,格式化输出友好的话,可以有效的提高调试的效率,不然眼睛盯着都难受也找不到需要的参数在哪。。。。因此,在这里整理一下,各种格式化输出的常见方法。C语言C语言中的输出函数为printf(),函数的圆形在头文件"stdio.h"中,但是,printf函数是个特例,在使用它的时候,不是必须包含头文件"stdio.h"。printf函数调用的一般形式为:printf(“格式控制字符串 && 非格式字符串”, 输出表列)其中格式控制字符串用于指定输出格式,格式字符串是以%开头的字原创 2021-07-03 23:10:13 · 10268 阅读 · 4 评论 -
C++ 并发指南 std::launch
launch是枚举类型,用于启动异步任务时,传递给函数async的参数,它的定义如下:enum class launch { async = 0x1, deferred = 0x2};launch::asynclaunch::async 表示在调用async函数的时候就开始创建新线程。#include<iostream>#include<future>using namespace std; class ThreadManage{public: int原创 2021-03-18 11:31:36 · 363 阅读 · 0 评论 -
C++ 并发指南 std::async
首先,来看下std::async函数的原型:template<class Fn, class... Args>future<typename result_of<Fn(Args...)>::type> async(launch policy, Fn&& fn, Args&&...args);可以看出,async有三个参数,其中第一个参数用于设置数据交互方式,第二个参数是一个可调用的对象(仿函数、lambda表达式、类成员函数、普通函原创 2021-03-15 16:35:51 · 456 阅读 · 0 评论 -
C++ 并发指南 std::atomic
std::atomic 基本介绍std::atomic 是模板类,一个模板类型为 T 的原子对象中封装了一个类型为 T 的值。template struct atomic;原子类型对象的主要特点就是从不同线程访问不会导致数据竞争(data race)。因此从不同线程访问某个原子对象是良性 (well-defined) 行为,而通常对于非原子类型而言,并发访问某个对象(如果不做任何同步操作)会导致未定义 (undifined) 行为发生。std::atomic 构造函数std::atomic 的构原创 2021-03-04 14:44:09 · 3442 阅读 · 1 评论 -
C++ 并发指南 std::atomic_flag
本文介绍 < atomic > 头文件中最简单的原子类型: atomic_flag。atomic_flag 一种简单的原子布尔类型,只支持两种操作,test-and-set 和 clear。std::atomic_flag 构造函数std::atomic_flag 构造函数如下:atomic_flag() noexcept = default;atomic_flag (const atomic_flag&T) = delete;std::atomic_flag 只有默认构造原创 2021-03-04 11:43:47 · 2020 阅读 · 1 评论 -
C++ 并发指南 std::condition_variable
< condition_variable > 头文件主要包含了与条件变量相关的类和函数。相关的类包括 std::condition_variable 和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数 std::notify_all_at_thread_exit(),下面分别介绍一下以上几种类型。std::condition_variable 类介绍当 std::condition_variable 对象的某个 wait 函数原创 2021-03-03 18:11:24 · 682 阅读 · 1 评论 -
C++ 并发指南< future >(3)std::future & std::shared_future
std::future介绍简单地说,std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段。std::future 通常由某个 Provider 创建,你可以把 Provider 想象成一个异步任务的提供者,Provider 在某个线程中设置共享状态的值,与该共享状态相关联的 std::future 对象调用 get(通常在另外一个线程中) 获取该值,如果共享状态的标志不为 ready,则调用 std::future::get 会阻塞当前的调用者,直到 Provi原创 2021-03-02 18:07:34 · 508 阅读 · 1 评论 -
C++ 并发指南<future>(2)std::packaged_task
std::packaged_task 包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果,从包装可调用对象意义上来讲,std::packaged_task 与 std::function 类似,只不过 std::packaged_task 将其包装的可调用对象的执行结果传递给一个 std::future 对象(该对象通常在另外一个线程中获取 std::packaged_task 任务的执行结果)。std::packaged_task 对象内部包含了两个最基本元素:被包装的任务(stored原创 2021-02-26 17:47:29 · 1909 阅读 · 0 评论 -
C++ 并发指南<future>(1) std::promise
< future > 头文件中包含了以下几个类和函数:Providers 类:std::promise, std::package_taskFutures 类:std::future, shared_future.Providers 函数:std::async()其他类型:std::future_error, std::future_errc, std::future_status,std::launch.std::promise 类介绍promise 对象可以保存某一类型 T原创 2021-02-26 17:03:31 · 345 阅读 · 0 评论 -
C++ 并发指南 std::lock
C++11 标准为我们提供了两种基本的锁类型,分别如下:std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁。std::unique_lock,与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。另外还提供了几个与锁类型相关的 Tag 类,分别如下:std::adopt_lock_t,一个空的标记类,定义如下:struct adopt_lock_t {};该类型的常量对象adopt_lock。adopt_lock 是一个原创 2021-02-18 16:30:10 · 1490 阅读 · 0 评论 -
C++ 并发指南 std::mutex
这几篇都是拜读大神后,记录下来的笔记,链接https://www.cnblogs.com/haippy/p/3284540.htmlMutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 < mutex > 头文件中,所以需要使用 std::mutex,就必须包含 < mutex > 头文件。< mutex >头文件Mutex系列类std::mutex,最基本的 Mutex 类。std::recursive_mutex,.原创 2021-02-06 23:18:25 · 227 阅读 · 1 评论 -
C++ 多线程之间的数据交互
参考博客https://blog.csdn.net/hai008007/article/details/80246437,在此之上整理修改。同一个进程内的多个线程之间免不了需要进行数据的交互,队列和共享数据是实现多个线程之间的数据交互的常用方式,封装好的队列使用起来相对来说不容易出错一些,而共享数据则是最基本的也是较容易出错的,因为它会产生数据争用的情况,即有超过一个线程试图同时抢占某个资源,比如对某块内存进行读写等,如下例所示:#include <iostream>#include .原创 2021-01-14 14:36:00 · 7007 阅读 · 1 评论 -
C++ thread
本文仅用来记录学习过程,学习网站:菜鸟教程c++ 11 之后有了标准的线程库:std::thread。编译时记得加上参数 -lpthread,如g++ test.cpp -o a -lpthreadthread 构造函数类型函数默认构造函数thread() noexcept;初始化构造函数template <class Fn, class… Args>拷贝构造函数 [deleted]thread(const thread&) = de.原创 2021-01-12 17:06:37 · 1325 阅读 · 0 评论 -
C++ 进程、线程
大神链接https://www.cnblogs.com/eilearn/p/9414569.htmlhttps://blog.csdn.net/zhouchunyue/article/details/79271869进程狭义定义:进程就是一段程序的执行过程。广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。简单的来讲进程的概念主要有两点:第一,进程是一个实体。每一个进程.原创 2021-01-05 16:06:17 · 2323 阅读 · 0 评论 -
C++ 智能指针
大神原文链接 https://www.cnblogs.com/WindSun/p/11444429.html简单介绍智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。只有引用计数为0时,智能指针才会自动释放引用的.原创 2021-01-05 13:51:05 · 229 阅读 · 0 评论 -
C++模板
本文转载自:https://blog.csdn.net/tonglin12138/article/details/88595747#t0,自己稍加整理。模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。模板是一种对类型进行参数.原创 2020-12-21 17:59:41 · 79 阅读 · 0 评论 -
C++中explicit关键字
C++中的explicit关键字用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的。类构造函数默认情况下即声明为implicit(隐式)。上个例子:class CxString // 没有使用explicit关键字的类声明, 即默认为隐式声明 { public: char *_pstr; int _size; CxString(int size)原创 2020-12-15 17:39:32 · 120 阅读 · 0 评论 -
C++函数修饰符总结
本文转载自https://tlanyan.me/cpp-function-modifier-summary/C++博大精深,而且不断拥抱新的变化。本文简要总结一下C++中函数的修饰符,其中部分在实际中极少用到。按修饰符的位置分为函数名前与函数名后两种,以下分别做介绍。函数名前返回值类型 返回值类型是C++中定义函数的必备部分,这些修饰符包括void,(unsigned)int,bool等内置基本数据类型和自定义类型,也包括修饰返回值const关键字(如constint*),还包括C++11.原创 2020-12-10 15:00:08 · 676 阅读 · 0 评论 -
C++ 类型转换
按照惯例,奉上大神链接C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用,如下表:转换类型操作符作用const_cast去掉类型的const或volatile属性static_cast无条件转换,静态类型转换dynamic_cast有条件转换,动态类型转换,运行时检查类型安全(转换失败返回NULL)reinterpret_cast仅重新解释类型,但没有进行二进制的转换const_cast去掉类型的const或volatile属性#in原创 2020-12-08 11:21:26 · 109 阅读 · 0 评论 -
C++ 11 Lambda函数
本文转载自 https://www.cnblogs.com/WindSun/p/11182276.htmlC++11新增了lambda函数,其基本格式如下:[捕捉列表] (参数) mutable -> 返回值类型 {函数体}说明:[]是lambda的引出符,捕捉列表能够捕捉上下文中的变量,来供lambda函数使用: [var] 表示以值传递方式捕捉变量var [=] 表示值传递捕捉所有父作用域变量 [&var] 表示以引用传递方式捕捉变量var [&原创 2020-12-07 14:09:11 · 189 阅读 · 0 评论 -
const和constexpr的比较
本文转自大神博客,在此膜拜。constc++ 中 const 可以用来修饰变量、函数,且不同用处时有不同的含义,下面进行下说明const 语义C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象的常量性的操作都视为error。对象的常量性可以分为两种:物理常量性(即每个bit都不可改变)和逻辑常量性(即对象的表现保持不变)。C++中采用的是物理常量性,例如下面的例子:struct A { int *ptr;};int k = 5, r =原创 2020-12-04 12:01:34 · 640 阅读 · 0 评论 -
g++ 使用总结
这是之前不记得在哪个大神哪里读到的文章,现在找不到了,这里仅仅作为记录,供大家参考。gcc是一款跨平台的C/C++编译器,可以在Linux/Windows平台下使用,具有十分强大的功能,结构也十分灵活,并且可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada的编译。许多有名的工程和库都是使用gcc进行编译的,如nginx,libevent等。g++可以在命令行使用,也可以通过配置IDE的编译环境来调用系统配置的g++环境,大家可以根据需要自行配置。.原创 2020-11-23 16:33:29 · 1627 阅读 · 0 评论 -
c++ IPOPT 库 与 python非线性规(优)划(化)工具
本篇针对非线性规(优)划(化)问题,介绍两个好用的模型构建不求解工具:CppAD与pyomo。这两个工具都可以只构建目标函数与约束函数的形式,而不需要求其雅可比、海森矩阵。两个工具都可以接受非线性模型形式,并且有与各种优化求解器的接口。首先声明,这篇文章是转载的,先上链接 https://blog.csdn.net/u013468614/article/details/103624851另...转载 2020-04-07 18:56:35 · 5106 阅读 · 5 评论 -
Eigen 库简单使用
首先,献上eigen官方的 网址,一切以官方为准。具体的下载还有安装方法,官方的说明都有,具体这里就不多说了。1 模块和头文件Eigen库有一个 Core模块和若干个其他模块组成。每个模块都有对应的头文件,需要使用相应模块的功能的话,就必须 include 对应的头文件。| Core | |ModuleHeader fileContentsCore#in...原创 2020-01-07 15:26:32 · 816 阅读 · 0 评论 -
Ipopt安装
Ipopt是一款用来计算大规模非线性优化的开源软件包,这里用来求解MPC。安装所需功能包$ sudo apt-get install gcc g++ gfortran subversion patch wget下载源码下载最新的源码https://www.coin-or.org/download/source/Ipopt/版本至少大于 3.12.7, 本文下载的为 3.12.7。下...原创 2019-11-15 14:56:39 · 18132 阅读 · 10 评论 -
Socket 开发记录
这几天需要用socket 开发一个UDP程序,接收远程控制指令,开发完毕后,就仔细的学习了下,在此处记录一下socket开发过程。首先,声明一下这边文章都是拜读了几位大神的文章后,自己重新整理的。1 socket介绍socket编程是一门技术,它主要是在网络通信中经常用到。既然是一门技术,由于现在是面向对象的编程,一些计算机行业的大神通过抽象的理念,在现实中通过反复的理论或者实际的推导,提出了抽象的一些通信协议,基于tcp/ip协议,提出大致的构想,一些泛型的程序大牛在这个协议的基础上,将这些抽象化原创 2020-08-24 10:48:27 · 206 阅读 · 0 评论 -
C++ STL复习(14)迭代器适配器
C++ 11 标准中,迭代器适配器供有 4 类,它们各自的名称和功能如下表所示。实际上,前面在学习各种容器的迭代器时,我们经常会使用到反向迭代器。下面样例,演示了用反向迭代器适配器遍历 list 容器的实现过程:#include <iostream>#include <list>using namespace std;int main(){ std::list<int> values{ 1,2,3,4,5 }; //找到遍历的起点和终点,原创 2020-08-20 23:36:37 · 317 阅读 · 0 评论 -
C++ STL复习(13)容器适配器
STL 提供了 3 种容器适配器,分别为 stack 栈适配器、queue 队列适配器以及 priority_queue 优先权队列适配器。不同场景下,由于不同的序列式容器其底层采用的数据结构不同,因此容器适配器的执行效率也不尽相同。1 stack容器适配器stack 栈适配器是一种单端开口的容器,实际上该容器模拟的就是栈存储结构,即无论是向里存数据还是从中取数据,都只能从这一个开口实现操作。stack 适配器的开头端通常称为栈顶。由于数据的存和取只能从栈顶处进行操作,因此对于存取数据,stac原创 2020-08-18 22:28:04 · 219 阅读 · 0 评论 -
C++ STL复习(12)无序容器
和关联式容器一样,无序容器也使用键值对(pair 类型)的方式存储数据。不过,它们有本质上的不同:关联式容器的底层实现采用的树存储结构,更确切的说是红黑树结构;无序容器的底层实现采用的是哈希表的存储结构。基于底层实现采用了不同的数据结构,因此和关联式容器相比,无序容器具有以下 2 个特点:无序容器内部存储的键值对是无序的,各键值对的存储位置取决于该键值对中的键;和关联式容器相比,无序容器擅长通过指定键查找对应的值(平均时间复杂度为 O(1));但对于使用迭代器遍历容器中存储的元素,无序容器的原创 2020-08-17 22:02:55 · 422 阅读 · 0 评论 -
C++ STL库复习(11) set
和 map、multimap 容器不同,使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等。举个例子,如下有 2 组键值对数据:{<'a', 1>, <'b', 2>, <'c', 3>}{<'a', 'a'>, <'b', 'b'>, <'c', 'c'>}显然,第一组数据中各键值对的键和值不相等,而第二组中各键值对的键和值对应相等。对于 set 容器来说,只能存储第 2 组键值对,而无法存储第一原创 2020-08-10 22:35:59 · 684 阅读 · 0 评论 -
C++ STL库复习(10)map
作为关联式容器的一种,map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。与此同时,在使用 map 容器存储多个键值对时,该容器会自动根据各键值对的键的大小,按照既定的规则进行排序。默认情况下,map 容器选用std::less排序规则(其中 T 表示键的数据类型),其会根据键的大小对所有键值对做升序排序。当然,根据实际情况的需要,我们可以手动指定 m原创 2020-08-09 23:18:23 · 464 阅读 · 0 评论 -
C++ STL库复习(9)pair
pair 对象的创建关联式容器存储的是“键值对”形式的数据,其中第一个元素作为键(key),第二个元素作为值(value)。注意,基于各个关联式容器存储数据的特点,只有各个键值对中的键和值全部对应相等时,才能使用 set 和 multiset 关联式容器存储,否则就要选用 map 或者 multimap 关联式容器。pair 类模板定义在头文件中,所以在使用该类模板之前,需引入此头文件。具体的创建方式,直接从程序看比较直观:#include <iostream>#include <原创 2020-06-24 18:10:46 · 153 阅读 · 0 评论 -
C++ STL库复习(8)关联式容器
C++ STL关联式容器是什么通过学习所有的序列式容器不难发现,无论是哪种序列式容器,其存储的都是 C++ 基本数据类型(诸如 int、double、float、string 等)或使用结构体自定义类型的元素。例如,如下是一个存储 int 类型元素的 vector 容器:std::vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19};关联式容器则大不一样,此类容器在存储元素值的同时,还会为各元素额外再配备一个值(又称为“键”,其本质也是一个 C+原创 2020-06-24 17:36:42 · 118 阅读 · 0 评论 -
C++ 常用库一览
转载自大神的博客,先奉上原文地址 https://segmentfault.com/a/1190000011483340#item-34标准库C++标准库,包括了STL容器,算法和函数等。C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。Standard Template Library:标准模板库C POSIX lib...转载 2020-04-06 10:10:10 · 4118 阅读 · 0 评论 -
C++ STL库复习(7)forward_list
forward_list 容器以单链表的形式存储元素。forward_list 的模板定义在头文件 forward_list 中。fdrward_list 和 list 最主要的区别是:它不能反向遍历元素;只能从头到尾遍历。forward_list 的单向链接性也意味着它会有一些其他的特性:无法使用反向迭代器。只能从它得到const或non-const前向迭代器,这些迭代器都不能解...原创 2020-04-05 22:35:21 · 331 阅读 · 0 评论 -
C++ STL库复习(6)list
list 容器模板定义在 list 头文件中,是 T 类型对象的双向链表。因此,使用 list 模板时,要#include <list>list 容器具有一些 vector 和 deque 容器所不具备的优势,它可以在常规时间内,在序列已知的任何位置插入或删除元素。这是我们使用 list,而不使用 vector 或 deque 容器的主要原因。list 的缺点是无法通过位置来直...原创 2020-04-05 21:32:57 · 248 阅读 · 0 评论 -
C++ STL库复习(5)deque
deque,一个定义在 deque 头文件中的容器模板,可以生成包含 T 类型元素的容器,它以双端队列的形式组织元素。可以在容器的头部和尾部高效地添加或删除对象,这是它相对于 vector 容器的优势。当需要这种功能时,可以选择这种类型的容器。无论何时,当应用包含先入先出的事务处理时,都应该使用 deque 容器。处理数据库事务或模拟一家超市的结账队列,像这两种应用都可以充分利用 deque 容...原创 2020-04-03 10:57:50 · 263 阅读 · 0 评论 -
C++ STL库复习(4)vector
再次声明一下,本文是转载于 http://c.biancheng.net/ ,并非本人编写。vector 容器是包含 T 类型元素的序列容器,和 array<T,N> 容器相似,不同的是 vector 容器的大小可以自动增长,从而可以包含任意数量的元素;因此类型参数 T 不再需要模板参数 N。只要元素个数超出 vector 当前容量,就会自动分配更多的空间。只能在容器尾部高效地删除或...原创 2020-04-02 16:08:00 · 366 阅读 · 0 评论