![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c++ 学习
文章平均质量分 69
c++ 学习
虾球xz
光说不练假把式
展开
-
C++并发编程实战 第2版学习
C++并发编程实战 第2版原创 2024-07-11 00:26:22 · 383 阅读 · 0 评论 -
c++ 学习笔记
c++ 学习原创 2023-04-01 18:44:06 · 338 阅读 · 0 评论 -
c++ 17 c++ 20 学习
c++ 学习原创 2023-01-31 21:59:40 · 188 阅读 · 0 评论 -
c++ 学习记录
c++ 学习记录原创 2022-11-05 23:29:41 · 374 阅读 · 0 评论 -
C++ lambda 学习笔记
c++ lambda原创 2022-10-01 19:02:11 · 1785 阅读 · 0 评论 -
C++ 移动语义学习
c++ 学习原创 2022-09-03 21:55:25 · 1501 阅读 · 0 评论 -
c++ primer 书代码学习
#include <iostream>#include <string>using namespace std;class Sales_item{ friend std::istream& operator>>(std::istream&, Sales_item& ); friend std::ostream& operator<<(std::ostream&, const Sales_item&.原创 2022-01-06 17:45:54 · 1330 阅读 · 0 评论 -
数据结构算法与应用-C++语言描述 stack的应用
main.cpp#include <string>#include <iostream>#include <sstream>#include <algorithm>#include <iterator>using namespace std;//数据结构算法与应用-C++语言描述 stack的应用//线性表一数组//抽象数据类型template<class T>class linearList{pub原创 2021-12-13 22:34:24 · 1519 阅读 · 0 评论 -
数据结构算法与应用-C++语言描述 stack链表的实现
//数据结构算法与应用-C++语言描述 stack链表的实现//链表描述main.cpp#include <iostream>#include <sstream>#include <iterator>using namespace std;//数据结构算法与应用-C++语言描述 chain 单链表//一个线性表的抽象类template <class T>class linearList {public: virtual ~lin原创 2021-12-12 18:25:14 · 364 阅读 · 0 评论 -
数据结构算法与应用-C++语言描述 stack数组的实现
#include <iostream>#include <sstream>#include <algorithm>#include <iterator>//数据结构算法与应用-C++语言描述 stack数组的实现using namespace std;//线性表一数组//抽象数据类型template<class T>class linearList{public: virtual ~linearList() {}原创 2021-12-12 14:26:09 · 366 阅读 · 0 评论 -
数据结构算法与应用-C++语言描述 矩阵
数据结构算法与应用-C++语言描述 chain 矩阵定义和操作一个m x n的矩阵 (matrix ) 是一个m行、n列的表 ,m和n是矩阵的维数 ( dimension )。/*列1 列2 列3 列4行1 7 2 0 9行2 0 1 0 5行3 6 4 2 0行4 8 2 7 3行5 1 4 9 6*///类 matrix//一个rows x cols 的整型矩阵 M 可用如下的二维整数数组来描述//int x[ro原创 2021-12-11 11:25:25 · 2332 阅读 · 0 评论 -
数据结构算法与应用-C++语言描述 chain 单链表2
chain.cpp#include <iostream>#include <sstream>#include <iterator>using namespace std;//数据结构算法与应用-C++语言描述 chain 单链表//一个线性表的抽象类template <class T>class linearList {public: virtual ~linearList(){} //返回true,当且仅当线性表为空 virtu原创 2021-12-10 10:03:53 · 593 阅读 · 0 评论 -
数据结构算法与应用-C++语言描述 chain 单链表 带头节点
chain.cpp//循环链表和头节点//1 ) 把线性表描述成一个单向//循环链表 ( singly linked circular list ) ( 简称循环链表 ),而不是单向链表 ; //2 ) 在链表的前面增加一个节点,称为头节点(header node )。只要将单向链表的尾节点与头节点链接起来,单向//链表就成为循环链表,#include <iostream>#include <sstream>#include <iterator>#inc原创 2021-12-07 20:09:24 · 993 阅读 · 0 评论 -
数据结构算法与应用-C++语言描述 chain 单链表
chain.cpp#include <iostream>#include <sstream>#include <iterator>using namespace std;//数据结构算法与应用-C++语言描述 chain 单链表//一个线性表的抽象类template <class T>class linearList {public: virtual ~linearList(){} //返回true,当且仅当线性表为空 virtu原创 2021-12-05 22:34:50 · 1706 阅读 · 0 评论 -
数据结构算法与应用-C++语言描述 vectorList
vectorList.cpp#include <exception>#include <iostream>#include <sstream>#include <iterator>#include <algorithm>#include <vector>using namespace std;//一个线性表的抽象类template <class T>class linearList {public原创 2021-12-04 23:32:38 · 186 阅读 · 0 评论 -
数据结构算法与应用-C++语言描述 - arrayList
arrayList#include <iostream>#include <sstream>using namespace std;//数据结构算法与应用-C++语言描述 arrayList//一个线性表的抽象类template <class T>class linearList {public: virtual ~linearList(){} virtual bool empty() const = 0;//返回true,当且仅当线性表为空 v原创 2021-12-04 14:35:54 · 1386 阅读 · 0 评论 -
c++ 算法学习
1.2 函数与参数CMakeLists.txtcmake_minimum_required(VERSION 3.1)project(test)add_executable(test main.cpp)#include <iostream>using namespace std;int abc(int a,int b,int c){ return a + b * c;}int main(){ int a = 1,b = 2,c = 3; std::cout&l原创 2021-12-02 00:16:28 · 2669 阅读 · 0 评论 -
c++ call_once 单例
#include <iostream>#include <mutex>#include <pthread.h>constexpr auto times = 50;class MySingleton{public: static MySingleton &getInstance() { std::call_once(initInstanceFlag, &MySingleton::initSingleton);原创 2021-11-12 12:01:52 · 2455 阅读 · 0 评论 -
c++高级编程学习笔记7
深入了解模板参数实际上有 3 种模板参数: 类型参数、非类型参数和 template template 参数(这里没有重复,确实就是这个名称)。第 12 章曾列举类型参数和非类型参数的例子,但没有见过 template template 参数。这一章也有一些第 12章没有涉及的有关类型参数和非类型参数的为手问题。下面深入探讨这三类模板参数。深入了解模板类型参数模板的类型参数是模板的精髓。可声明任意数目的类型参数。例如,可给第 12 章的网格模板添加第二个类型参数,以表示这个网格构建于另一个模板化的类容原创 2021-10-04 10:41:34 · 1197 阅读 · 0 评论 -
c++高级编程学习笔记6
其他库工具ratio 库可通过 ratio 库精确地表示任何可在编译时使用的有限有理数。ratio 对象在 std::chrono::duration 类中使用。与有理数相关的所有内容都在头文件中定义,并且都在 std 名称空间中。有理数的分子和分母通过类型为 std::intmax_t 的编译时常量表示,这是一种有符号的整数类型,其最大宽度由编译器指定。由于这些有理数编译时的特性,它们在使用时看上去比较复杂,不同寻常。ratio 对象的定义方式和普通对象的定义方式不同, 而且不能调用 ratio 对象原创 2021-10-02 21:41:04 · 1149 阅读 · 1 评论 -
c++高级编程学习笔记5
multimapmultimap 是一种允许多个元素使用同一个键的 map。和 map 一样,multimap 支持统一初始化。multimap的接口和 map 的接口几乎相同,区别在于multimap 不提供 operator[]和 at()。它们的语义在多个元素可以使用同一个键的情况下没有意义。在 multimap 上执行插入操作总是会成功。因此,添加单个元素的 multimap::insert()方法只返回 iterator而不返回 pair。map 支持 insert_or_assign()和 t原创 2021-09-29 20:16:35 · 1829 阅读 · 0 评论 -
c++高级编程学习笔记4
C++运算符重载运算符重载概述根据第 1 章的描述,C++中的运算符是一些类似于+、<、*和<<的符号。这些运算符可应用于内建类型,例如 int 和 double,从而实现算术操作、逻辑操作和其他操作。还有->和*运算符可对指针进行解除引用操作。C++中运算符的概念十分广泛,甚至包含、(0)(函数调用)、类型转换以及内存分配和内存释放例程。重载运算符的原因在学习重载运算符前,首先需要了解为什么需要重载运算符。不同的运算符有不同的理由,但是基本指导原则是为了让自定义类的行为和内原创 2021-09-27 19:13:29 · 1482 阅读 · 1 评论 -
c++高级编程学习笔记3
函数指针的类型别名我们通常不考虑函数在内存中的位置,但每个函数实际上都位于某个特定地址。在 C++中,可像使用数据那样使用函数。换言之,可使用函数的地址,就像使用变量那样。函数指针的类型取决于兼容函数的参数类型的返回类型。处理函数指针的一种方式是使用类型别名。类型别名允许将一个类型名指定给具有指定特征的一系列函数。例如,下面的代码行定义了 MatchFunction 类型,该类型表示一个指针,这个指针指向具有两个 int 参数并返回布尔值的任何函数:using MatchFunction = bool(原创 2021-09-24 17:58:34 · 1142 阅读 · 0 评论 -
c++高级编程学习笔记2
警告;在现代 C++中,应尽可能避免底层内存操作,而使用现代结构,例如容器和智能指针。使用动态内存警告:作为经验法则,每次声明一个指针变量时,务必立即用适当的指针或 nullptr 进行初始化!例如,图 7-1 显示了执行以下代码后的内存状态。这行代码在一个函数内,所以i是一个局部变量:int i = 7;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNWUi2i1-1632236813891)(/home/xz/图片/选区_928.png)]i是在栈上分原创 2021-09-22 19:06:45 · 419 阅读 · 0 评论 -
c++高级编程学习笔记
小程序“hello world”下面的代码可能是你所遇到的最简单 C++程序://helloworld.cpp#include <iostream>int main(){ std::cout<<"Hello world!"<<std::endl; return 0;}正如预期的那样,这段代码会在屏幕上输出“Hello,World!”这一信息。这是一个非常简单的程序,好像不会赢得任何赞誉,但是这个程序确实展现出与 C++程序格式相关的一些重要原创 2021-09-19 17:16:32 · 720 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 - 多线程 内存模型 注意事项
注意事项多线程线程线程是编写并发程序的基础件。减少线程的创建一个线程的开销有多大?非常巨大!这就是最佳实践背后的问题。让我们先看看线程的大小,而不是创建它的成本。线程大小std::thread是对本机操作系统线程的包装,这意味着需要对Windows线程和POSIX thread的大小进行了解:Windows:线程堆栈大小给了我答案:1MB。POSIX:pthread手册页为我提供了i386和x86_64架构的答案:2MB。下面有支持POSIX架构的线程堆栈大小:创建耗时我不知道创建原创 2021-08-24 23:13:53 · 201 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 - 并发架构
并发架构活动对象的设计模式将执行与调用进行解耦,每个对象会留在自己的控制线程中,其目标是通过使用异步方法和调度器来引入并发。维基百科:Active object监控对象的设计模式,会同步并发方法的执行,以确保对象每次只运行一个成员函数。并且,还允许对象的成员函数协同调度序列的执行。半同步/半异步体系结构模式,在并发系统中对异步和同步服务处理进行解耦,从而在不降低太多性能的情况下简化编程。该模式引入了两个通信层,一个用于异步,另一个用于同步。活动对象 活动对象模式将执行与对象的成员原创 2021-08-24 22:00:13 · 246 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 - 同步策略
处理共享如果使用不共享数据,就没有竞争。不共享意味着线程只处理本地变量,可以通过值复制、特定的线程存储,也可以通过受保护的数据通道将结果传输到future来实现。本节中的模式非常直观,我会给出一些简单的解释。值复制线程通过值复制,而不是引用来获取参数时,就不需要对任何数据的访问进行同步,也就没有数据竞争的条件和数据生命周期的问题。使用引用的数据竞争下面的程序启动三个线程:一个线程通过复制获取参数,另一个线程通过引用获取参数,最后一个线程通过常量引用获取参数。// copiedValueDataR原创 2021-08-24 16:26:53 · 244 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 - 原子智能指针
原子智能指针 std::shared_ptr由控制块和相关资源组成。std::shared_ptr能够保证控制块是线程安全的,但是对相关资源的访问就不是了。这意味着,修改引用计数器是一个原子操作,可以确保资源删除一次。线程安全的重要性这里只说明std::shared_ptr具有定义良好的多线程语义是有多么重要。乍一看,使用std::shared_ptr并不是多线程程序的明智选择。根据定义,它是共享和可变的,是数据竞争和未定义行为的理想对象。另一方面,现代C++中有一条准则:不要接触内存。这意味着在多原创 2021-08-24 15:41:42 · 659 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 - 使用CppMem进行优化
使用CppMem进行优化我们从一个简单的程序开始,然后对其不断地进行改进。这里,使用CppMem验证的每个步骤。CppMem是一个交互式工具,用于研究小代码段中C++内存模型的行为。首先,来写个简单的程序:// ongoingOptimisation.cpp#include <iostream>#include <thread>int x = 0;int y = 0;void writing() { x = 2000; y = 11;}void原创 2021-08-24 14:31:04 · 511 阅读 · 1 评论 -
Concurrency-with-Modern-Cpp学习笔记 - 单例模式性能比较
单例模式:线程安全的初始化开始研究之前,说明一下:我个人并不提倡使用单例模式。对于单例模式的看法我只在案例研究中使用单例模式,因为它是以线程安全的方式,初始化变量的典型例子。先来了解一下单例模式的几个严重缺点:单例是一个经过乔装打扮的全局变量。因此,测试起来非常困难,因为它依赖于全局的状态。通过MySingleton::getInstance()可以在函数中使用单例,不过函数接口不会说明内部使用了单例,并隐式依赖于对单例。若将静态对象x和y放在单独的源文件中,并且这些对象的构造方式相互依赖,原创 2021-08-24 12:12:07 · 196 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 - 性能比较
求向量元素的加和向std::vector中添加元素最快的方法是哪种?为了得到答案,我准备向std::vector中填充了一亿个数值,这些数在1~10之间均匀分布 。我们的任务是用各种方法计算这些数字的和,并添加执行时间作为性能指标。本节将讨论原子、锁、线程本地数据和任务。单线程方式最直接的方式是使用for循环进行数字的添加。for循环下面的代码中,第27行进行加和计算。// calculateWithLoop.cpp#include <chrono>#include <i原创 2021-08-24 11:10:48 · 282 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 - 标准库的并行算法
标准库的并行算法标准模板库有100多种搜索、计数和范围操作算法。C++17中,重载了69个,并新添加了8个。这些重载版本和新算法,可以使用执行策略来调用。执行策略可以指定算法串行、并行,还是向量化并行。使用执行策略时,需要包含头文件<execution>。执行策略C++17标准中定义了三种执行策略:std::execution::sequenced_policystd::execution::parallel_policystd::execution::parallel_unse原创 2021-08-24 09:20:31 · 583 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 - 线程
线程创建线程线程std::thread对象表示一个可执行单元。当工作包是可调用单元时,工作包可以立即启动。线程对象是不可复制构造或复制赋值的,但可移动构造或移动赋值。可调用单元是行为类似于函数。当然,它可以是一个函数,也可以是一个函数对象,或者一个Lambda表达式。通常忽略可调用单元的返回值。介绍完理论知识之后,我们来动手写个小例子。// createThread.cpp#include <thread>#include <iostream>void helloF原创 2021-08-23 18:14:22 · 330 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 - 栅栏
栅栏C++支持的栅栏类型:std::atomic_thread_fence和std::atomic_signal_fence。std::atomic_thread_fence : 同步线程间的内存访问。std::atomic_signal_fence : 线程内信号之间的同步。std::atomic_thread_fence可以防止特定的操作翻过栅栏。不需要原子变量,通常称为栅栏或内存屏障。栅栏当做内存屏障特定的操作不能翻过内存屏障。现在有两种操作:读写操作或加载/存储操作。if(resu原创 2021-08-16 09:20:49 · 693 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 - C++的六种内存序
C++的六种内存序原子操作默认的内存序是std::memory_order_seq_cst,这表示顺序一致。也可以显式地指定其他五个中的一个enum memory_order{ memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst}原子操作的种类这里有三种不同类型的原创 2021-08-15 20:56:30 · 1005 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 std::atomic模板
std::atomic模板std::atomic有各种变体。直接使用模板类:std::atomic<bool> 和 std::atomic<user-defined type>。部分特化可用于指针类:std::atomic<T*>。完全特化只能用于整型:std::atomic<integral type>。布尔原子类型和用户定义原子类型具有相同的接口,原子指针扩展了布尔原子类型,以及整数原子类型的接口。因其扩展了原子指针的接口,所以同样适用于整数原子原创 2021-08-15 17:43:59 · 872 阅读 · 0 评论 -
Concurrency-with-Modern-Cpp学习笔记 内存模型的基础知识
c++ 学习笔记 内存模型的基础知识引用cppreference.com中对内存位置的定义:标量对象(算术类型、指针类型、枚举类型或std::nullptr_t),或非零长度的连续序列。下面是内存位置的例子:struct S { char a; // memory location #1 int b : 5; // memory location #2 int c : 11, // memory location #2 (continued)原创 2021-08-15 13:08:50 · 253 阅读 · 0 评论