c/c++
文章平均质量分 78
一百编程网朱老师
一百编程网(100bcw.com)的愿望:
为有志于做软件开发的朋友传授知识,为程序员节约获取知识的时间和精力。为中华软件之崛起而发挥余热!
展开
-
浅谈OpenCV的多对象匹配透明图像的实现,以及如何匹配半透明控件
通过templateMatch算法,可以得到目标与原图像中等大子图像对应归一化的相关系数,这个归一化的相关系数可以看作是对于的概率(其实不是这样),可以设定一个阈值,把大于这个阈值的坐标都筛选出来。OpenCV的templateMatch中提供了一个可选的参数mask,这个mask是和目标等大的一张图,可以是U8C1也可以是FP32,其中U8C1对于每个点的含义是为0则放弃匹配该点,非0就会匹配,FP32是会将这个点像素在计算相关性时赋予对于的权重。可以用特征匹配的方法,利用这个特性对透明控件进行匹配。原创 2024-07-05 11:37:35 · 888 阅读 · 0 评论 -
深入剖析C++多态的实现与原理-详解 (三万字)
在虚函数后面写上=0,这个函数就为纯虚函数.纯虚函数只能写声明,不能写函数体.原创 2024-06-30 08:52:30 · 826 阅读 · 0 评论 -
std::future 如何保存多个对象进行同步等待
如果需要等待多个异步操作完成并获取它们各自的结果,可以使用 std::future 的姊妹类 std::shared_future 来实现。因此,可以将多个 std::shared_future 对象保存到一个容器中,然后使用 std::shared_future 的成员函数 wait() 或 get() 等待这些异步操作完成,并获取它们的结果。接下来,可以使用 std::shared_future 的成员函数 wait() 或 get() 等待这些异步操作完成,并获取它们的结果。原创 2024-06-24 11:27:57 · 311 阅读 · 0 评论 -
C++面试八股文:std::deque用过吗?
的底层容器,让我们比较一下三个容器的差异:(只考虑头插和尾插,因为stack不需要随机插入)二师兄:因为使用它的场景很少,大部分需要性能、且需要自动扩容的时候使用。中还有未被元素填充的位置,则将元素填充到数组中,如果此指针指向的。今天的面试分享到这里就结束了,让我们继续期待二师兄的表现吧。从上表中看到,三种容器的插入和是删除的时间复杂度相同。,插入要分情况,如果是头插和尾插,时间复杂度为。会找到头部或尾部的指针,并通过指针找到对应的。二师兄:说实话,很少用,基本没用过。,需要随机插入和删除的时候可以使用。原创 2024-06-24 11:11:55 · 298 阅读 · 0 评论 -
UE/C++简单功能实现笔记
本篇笔记主要用于记录如何利用C++在虚幻引擎5中实现一些基本的功能需求。目录。原创 2024-06-20 08:21:22 · 284 阅读 · 0 评论 -
CMake个人理解和使用
100编程书屋_孔夫子旧书网前言CMake是一个构建工具,通过它可以很容易创建跨平台的项目。通常使用它构建项目要分两步,通过源代码生成工程文件,通过工程文件构建目标产物(可能是动态库,静态库,也可能是可执行程序)。使用CMake的一个主要优势是在多平台或者多人协作的项目中,开发人员可以根据自己的喜好来使选择IDE,不用受其他人工程配置的影响,它有点像跨平台的IDE,通过它配置好相关设置之后,可以在多个平台无缝衔接,提高开发效率。最简单的CMake工程项目搭建一个用CMake来管理的项目,其项目根目录通常原创 2024-06-20 08:14:29 · 593 阅读 · 0 评论 -
C++面试八股文:什么是左值,什么是右值?
一次移动(当元素特别多时,移动的成本相对于拷贝基本可以忽略不记),一次析构。二师兄:移动构造是通过移动构造函数实现的,当类有资源需要管理时,拷贝构造会把资源复制一份,而移动构造偷走了原对象的资源。这里的确是通过static_cast实现的,讲左值强行转换成右值,用来匹配移动语义而非拷贝。时,为了保证程序的正确性,编译器可能会采用拷贝构造的方式实现移动构造,从而导致效率降低。是左值是和右值是匹配不同的实现,完成返回不同类型引用的目的。当传入的参数t的类型时右值时,由于引用折叠还是右值,此时的。原创 2024-06-20 07:54:11 · 577 阅读 · 0 评论 -
C++面试八股文:static和const的关键字有哪些用法?
关键字主要用在以下三个方面:1.用在全局作用域,修饰的变量或者函数为静态的,限制在本文件内使用。3.内类修饰成员函数和成员变量,此函数或变量由类持有,而非类的对象持有。修饰的函数是否在编译器求值要取决于传入的参数是不是编译器确定的,这属于元编程的范畴。常量指针的指针部分可变,指针指向的内容不可变。指针常量则相反,指针指向的内容可变,指针不可变。当使用consteval修饰函数和变量时,如果不能在编译时求值,则编译错误。如果传入的参数是编译时确定的,关键字只能用于静态变量的初始化,不能用于动态变量的初始化。原创 2024-06-07 07:24:33 · 566 阅读 · 0 评论 -
vs中.\ 与 ..\ 区别
需要注意的是,在跨平台开发中,应该避免硬编码路径分隔符和使用特定的路径表示方式。应该使用跨平台的路径处理函数来确保代码可以在不同操作系统上正确运行。则代表上一级目录,通常用于访问父目录中的文件或目录。因此,它们在路径表示中的含义和使用场景也是不同的。表示上一级目录(即父目录)下的文件 "file.txt"。代表当前目录,通常用于在当前目录下查找文件或目录,而。表示当前目录下的文件 "file.txt"。在 Visual Studio 中,在路径表示中的作用是不同的。是表示相对路径的两个特殊符号。原创 2024-06-03 08:06:15 · 653 阅读 · 0 评论 -
C++面试八股文:如何在堆上和栈上分配一块内存?
而new一般伴随三个动作,向操作系统申请一块内存,并执行类型的默认构造函数,然后返回类的指针。我们都知道new和delete成对出现,new[]和delete[]也是成对出现,那么我想问,如果使用new[]创建的对象用delete释放了会发生什么?我们都知道C++中的内存管理是一个比较麻烦的事情,现在有个需求,需要在程序中记录主动申请的内存和主动释放的内存,以确保没有发生内存泄漏。面试官:(笑)好吧,最后一个问题,咱们上面一直在讨论堆中的内存的分配和释放,请问一下,如果在栈上分配一块固定的内存?原创 2024-06-02 08:49:35 · 409 阅读 · 0 评论 -
C++面试八股文:struct、class和union有哪些区别?
当我们给us赋值1时,如果是大端,内存中的数据应该是这样的:0x00,0x01,这时候如果取uc的值,只能取到0x00。如果是小端,内存中的数据应该是0x01,0x00,此时取到的uc的值是0x01,返回1(true)。struct默认的成员是public的,而class的默认成员是private的。union实例的所有成员共享一块内存,这块内存的大小等同于union中成员尺寸最大的一个。对于一个IP地址,要么是IPV4要么是IPV6,IPV4和IPV6是互斥的,那么肯定有一块空间是被浪费了。原创 2024-06-02 08:40:39 · 245 阅读 · 0 评论 -
Rocksdb原理简介
MANIFEST包含了两个文件,一个log文件一个包含最新MANIFEST文件名的文件,Manifest的log文件名是这样 MANIFEST-(seq number),这个seq会一直增长.只有当 超过了指定的大小之后,MANIFEST会刷新一个新的文件,当新的文件刷新到磁盘(并且文件名更新)之后,老的文件会被删除掉。所有的WAL文件都是保存在WAL目录(options.wal_dir),为了保证数据的状态,所有的WAL文件的名字都是按照顺序的(log_number)。原创 2024-05-29 07:08:03 · 875 阅读 · 0 评论 -
【重学C++】05 | 说透右值引用、移动语义、完美转发(下)
假设我们要写一个工厂函数,该工厂函数负责创建一个对象,并返回该对象的智能指针。X(int a) {对于类X的调用方来说,应该与是完全一样的。也就是说,工厂函数factory_v1对调用者是透明的。传给factory_v1的入参arg能够完完整整(包括引用属性、const属性等)得传给T的构造函数。工厂函数factory_v1没有额外的副作用。这个就是C++的完美转发。单看factory_v1应用到X1。原创 2024-05-26 08:05:53 · 1056 阅读 · 0 评论 -
【重学C++】04 | 说透C++右值引用、移动语义、完美转发(上)
今天我们主要学了C++中右值引用的相关概念和应用场景,并花了很大篇幅讲解移动语义及其相关实现。右值引用主要解决实现移动语义和完美转发的问题。我们下节接着讲解右值是如何实现完美转发。欢迎关注,及时收到推送~原创 2024-05-24 14:57:50 · 859 阅读 · 0 评论 -
【重学C++】03 | 手撸C++智能指针实战教程
大家好,今天是【重学C++】的第三讲,书接上回,第二讲《02 脱离指针陷阱:深入浅出 C++ 智能指针》介绍了C++智能指针的一些使用方法和基本原理。今天,我们自己动手,从0到1实现一下自己的unique_ptr和shared_ptr。这一讲我们从AutoIntPtr出发,先是将类进行模版化,使其能够管理任何类型的指针对象,并给该类起了一个更抽象、更贴切的名称——smart_ptr。接着围绕着「如何正确释放资源对象指针」的问题,一步步手撸了两个智能指针 ——和。原创 2024-05-24 14:42:43 · 409 阅读 · 0 评论 -
【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针
大家好,今天是【重学C++】系列的第二讲,我们来聊聊C++的智能指针。避免手动管理内存带来的繁琐和容易出错的问题。unique_ptrshared_ptr和weak_ptr。每种智能指针都有各自的使用场景。unique_ptr用于管理独占式所有权的对象,它不能拷贝但可以移动,是最轻量级和最快的智能指针。shared_ptr用于管理多个对象共享所有权的情况,它可以拷贝和移动。weak_ptr则是用来解决shared_ptr循环引用的问题。下一节,我们将自己动手,从零实现一个C++智能指针。敬请期待!原创 2024-05-23 09:04:54 · 1125 阅读 · 0 评论 -
C++ 如何快速实现一个容器的迭代器
从定义不难看出,迭代器是一个泛化的指针。原创 2024-05-21 14:24:08 · 695 阅读 · 0 评论 -
c++函数参数和返回值
一般如果是 简单结构体,用 返回一个临时对象的方式解决。如果使用 返回一个参数指针,一般改成返回一个id,用一个manager来管理内存机制。或者 共享内存,内存池来解决内存泄露后续的问题用 参数引用来返回的话,一般会这么定义函数返回值,用来返回状态码,真正的数据,放到 result 中。原创 2024-05-15 11:38:51 · 603 阅读 · 0 评论 -
都说 C++ 没有 GC(垃圾回收),RAII: 那么我算个啥?
学过 Java、C# 或者其他托管语言(managed languages)的同学,回过头来看 C++ 的时候,第一反应就是 C++ 没有自动垃圾回收器(GC),而不能充分利用的资源被称为垃圾。那么 C++ 真的不能自动回收垃圾吗?带着这个疑问我们来看看一般 C++ 程序都是怎样回收资源的。这段示例代码在 function() 函数开始的时候申请了一块内存,大小对应于 int 类型,然后在函数结束的时候释放它。通常来说,这看起来很OK,没毛病,但是,如果遇到了下面几种情况呢?原创 2024-05-15 10:51:13 · 586 阅读 · 0 评论 -
C++ 初始化列表构造函数VS普通构造函数
对于一个类而言,只要其中包含有初始化列表的构造函数,编译器在编译使用{}语法的构造时会最倾向于调用初始化列表构造函数,哪怕做类型转换也在所不惜,哪怕有类型最佳匹配的普通构造函数或移动构造函数也会被劫持。假如{}内是空的,类中既有默认构造函数,也有初始化列表构造函数,此时{}会被视为没有实参,而不是一个空的初始化列表,因此会调用默认构造函数。如果就是想调用初始化列表构造函数,这应该使用{{}}的方式。只有在没有办法把{}中实参的类型转化为初始化列表时,编译器才会回到正常的函数决议流程中。原创 2024-05-13 08:52:22 · 357 阅读 · 0 评论 -
C++ requires关键字简介
是 C++20 中引入的一个新关键字,用于在函数模板或类模板中声明所需的一组语义要求,它可以用来限制模板参数,类似于。关键字仅能用于函数模板和类模板中,不能用于非模板函数和非模板类。关键字的语义要求必须在编译时可验证,否则将引发编译时错误。条件,代表由其修饰的函数/类的模板参数合法,可以正常使用。头文件下类型检查函数匹配使用,当。关键字限制函数模板参数。关键字限制类模板参数。原创 2024-05-12 12:21:18 · 393 阅读 · 0 评论 -
C++的拓扑排序实现
/0:白色节点(未发现),1:灰色节点(发现),2:黑色节点(完毕)return false;< 如果遇到了灰色节点,则表示发现了环。//标记为灰色节点(未发现)return false;< 后继节点包含环,返回false。//标记为黑色节点(已完成)class TopologicalSort//!//遇到环,则返回false。// 将所有节点的颜色标记为白色(未发现)// 拓扑排列(完成时间晚的放到前面)// 对每个白色节点进行深搜。原创 2024-04-19 08:06:25 · 397 阅读 · 0 评论 -
网络流的C++代码实现与过程讲解
网络流算法是通过将图中的边看作流量通道,将图的点看作流量的起点或终点,来求解图中的最大或最小流量的问题。它是一种非常重要的最优化算法,广泛应用于图论、运筹学、计算机网络等领域。网络流算法有很多种,其中最著名的是Ford-Fulkerson算法和Edmonds-Karp算法。这两种算法都使用了增广路径来寻找最大流量。本文将介绍Ford-Fulkerson算法的实现。原创 2024-04-19 08:03:53 · 393 阅读 · 0 评论 -
OpenFoam——案例之圆柱绕流【算例】
目前通过在 3 维中定义网格来处理 2 维几何,其中前平面和后平面定义为空边界块类型。读取二维 Fluent 网格时,转换器会自动在第三方向拉伸网格并添加空面片,将其命名为 frontAndBackPlanes。zeroGradient只表示在边界上梯度不变,并不是不随时间变化。uniform (0 0 0)更强硬一些,就是为某个值。:读取fluent.msh网格文件。本案例使用ICEM划分网格,并导入openfoam中。system/blockMeshDict文件可以删除。这是转换网格后自动生成的。原创 2024-04-17 08:24:44 · 876 阅读 · 0 评论 -
openmp中的任务(task)
Single选中的那个线程会在for循环中不停地创建任务,每一次循环就创建一个任务,这个任务被放入线程池(注意!这个任务不是被single的这个线程执行,而是先被放入任务池)。在不附加何限制的情况下, 这些任务将放入到任务池中, 由空闲的线程取出执行, 如上图所示。换言之, 任务的默认执行顺序是未指定的、随机的。一般而言, 通常使用指令single 利用一个线程创建任务(single 子句保证只有一个线程进行创建任务)。这些任务在创建后, 将被放入到任务池, 供线程组中空闲的线程获取和执行。原创 2024-04-12 10:43:15 · 986 阅读 · 1 评论 -
C++指针详解
指针是一个整数,一种存储内存地址的数字内存就像一条线性的线,在这条街上的每一个房子都有一个号码和地址类似比喻成电脑,这条街上每一个房子的地址是一个字节我们需要能够准确找到这些地址的方法,用来读写操作因此,指针就是这些地址。不要考虑类型,无论是什么类型的指针,都是用来保存地址的整数。原创 2024-01-08 10:35:25 · 788 阅读 · 0 评论 -
C++ TinyWebserver 部署到Linux下,并运行(使用的是Vmware的虚拟机运行Ubuntu20.04)
2. 首先进行mysql5.7的安装: 参考教程 : Ubuntu20.04安装MySQL5.7-实测3种方法(保姆级教程):https://blog.csdn.net/liuhuango123/article/details/128264867,3. 装好mysql后项目开始,按照TinyWebserver 中 readme中介绍,一步一步来,(也参考这个教程:https://blog.csdn.net/weixin_43330388/article/details/106222189)原创 2024-01-08 10:25:18 · 650 阅读 · 0 评论 -
C++移动构造与std::move()
程序定义了一个MyString类,其中构造函数和拷贝构造函数需要对传进来的字符串开辟空间并复制内容,另外一个Entity类含有一个MyString成员,并在初始化时复制传入的MyString对象。此为移动构造,接受的是一个右值,构造是直接复制原MyString的size与data,不重新开辟空间做深拷贝。用此引出移动构造和std::move()1. Entity右值构造时也可不使用std::move,直接将参数强转为右值类型也可以,std::move相当于通知构造函数以移动构造的方式进行。原创 2023-12-26 08:16:24 · 533 阅读 · 0 评论