c++
xizi_ghq
这个作者很懒,什么都没留下…
展开
-
C++ LRU
#include<bits/stdc++.h>using namespace std;/*思路:LRU最近最少使用,使用list存储链表使用unordered_map,来存储key和list的迭代器的映射查找的时候,使用map快速定位list,并且更新mp和list插入的时候也对他们两个进行更新*/class Lru{public : Lru(int siz=5):cnt(siz){}; void show(){ auto t=da.原创 2021-01-29 09:53:06 · 160 阅读 · 0 评论 -
C++手撕string(构造+析构+拷贝+右值拷贝)
#include<bits/stdc++.h>using namespace std;class sstring{public: sstring(const char *p=nullptr){ cout<<"sstring(const char *p=nullptr)"<<endl; if(p==nullptr){ _p=new char[1]; _p[0]='\0'; .原创 2020-12-28 09:55:01 · 470 阅读 · 0 评论 -
C++ 实现智能指针(带引用计数)
#include<bits/stdc++.h>using namespace std;//实现一个带引用计数的智能指针/*思路:对象有两个成员变量,一个成员变量指向资源,一个成员变量指向计数。(计数必须在堆上分配) 构造函数:让资源指针指向资源,并且创建一个和这个资源配对的int=1。 析构函数:判断int==0,决定是否释放资源 拷贝构造:int++,_p指向同一个资源 拷贝赋值运算符:检查自赋值,释放之前资源,赋值 解引用*:返回引用T...原创 2020-12-27 20:25:09 · 363 阅读 · 0 评论 -
C ++实现string
/*构造析构,拷贝、拷贝赋值版本*/class sstring{public: sstring(const char *p=NULL){//nullptr if(p==NULL){ _p=new char[1]; _p[0]='\0'; }else{ int len=strlen(p); _p=new char[len+1]; for(.原创 2020-12-26 11:10:56 · 178 阅读 · 2 评论 -
C ++实现顺序栈
版本一:int类型,只有构造函数和析构函数class sstack{public: sstack(int cap=10):_cap(cap){//开辟空间 _p=new int[cap](); _size=0; } ~sstack(){ delete[] _p; _p=NULL;//指针要等于nullptr _size=_cap=0; } void push(int x){原创 2020-12-26 10:06:55 · 186 阅读 · 0 评论 -
C ++ atomic 初次使用
基于 CAS的atomic 原子类型。互斥锁级别是重的,适用于:临界区代码做的事情复杂但是+±-这种操作,可以用CAS。CAS通常被称为无锁操作。但是并不是真的不加锁,而是在硬件方面枷锁。给总线上锁。cpu和内存交换数据,如果没有交换完毕的话,是不允许其他线程使用总线的。#include<iostream>#include<list>#include<mutex>#include<thread>#include<queue>#原创 2020-12-24 15:33:13 · 379 阅读 · 0 评论 -
C++11 uniptr_lock + condition_vartiable 实现生产者消费者模型
#include<iostream>#include<list>#include<mutex>#include<thread>#include<queue>#include<condition_variable>std::mutex mtx;std::condition_variable cv;//生产者生产完毕之后,通知消费者,消费者消费完毕之后通知生产者。class Queue{ public : .原创 2020-12-24 15:02:25 · 158 阅读 · 0 评论 -
C++ function底层实现
#include<iostream>using namespace std;template<typename T>class myfunction{};template<typename R,typename... A>class myfunction<R(A...)>{public : using FUNC =R(*)(A...); myfunction(FUNC p):_func(p){} R operator()(原创 2020-12-23 21:06:36 · 352 阅读 · 0 评论 -
C++STL 绑定器的bind1st 的使用场景 和底层实现原理。
bind1st:operator()的第一个形参变量绑定成一个确定值bind2st:operator()的第二个形参变量绑定成一个确定值上述两个绑定器将一个二元函数转化成一元函数。高元函数对象,降为低元函数对象。使用#include<bits/stdc++.h>using namespace std;template<typename Container>void show(Container &con){ typename Container::i原创 2020-12-23 19:27:59 · 230 阅读 · 0 评论 -
C++运算符重载,复数类
/*复数类:CComplex;C++ 的运算符重载:使对象的运算表现的和编译器内置类型一样。*/#include<iostream>using namespace std;class CComplex{public: //这里相当于定义了三个构造函数。 CComplex(int r=0,int i=0):mreal(r),mimage(i){} CComplex operator+(const CComplex &src){//不能返回对象的指针。原创 2020-12-22 20:18:45 · 212 阅读 · 0 评论 -
C ++ 面试 手撕 vector 构造、析构、赋值、拷贝、空间分配器实现
#include<iostream>using namespace std;//实现vector代码template<typename T>class Vec{public : Vec(int size=10){ _first=new T[size]; _last=_first; _end=_first+size; } ~Vec(){ delete[] _first; .原创 2020-12-22 15:45:50 · 976 阅读 · 0 评论 -
shared_ptr自定义实现
/*智能指针:拷贝赋值构造析构1、构造函数:可以默认构造(无参数),可以使用一个T指针构造,2、拷贝函数:引用计数++3、赋值构造:引用计数++4、析构函数,判断是否为05、get:返回普通指针6、重载-> 和&*/#include<bits/stdc++.h>using namespace std;template<typename T>class Ptr{public: Ptr();//默认构造函数 指针为nullptr原创 2020-11-05 10:50:33 · 443 阅读 · 0 评论 -
cout.setf()
cout.setf()的作用是通过设置格式标志来控制输出形式,如,其中ios_base::fixed表示:用正常的记数方法显示浮点数(与科学计数法相对应);ios_base::floatfield表示小数点后保留6位小数。setf()函数有两个原型:fmtflags setf(fmtflage) //第一原型boolalpha 可以使用单词”true”和”false”进行输入/输出的布尔值.oct 用八进制格式显示数值.dec 用十进制格式显示数值.hex 用十六原创 2020-10-22 16:50:31 · 296 阅读 · 0 评论 -
C++ 随机数
以前一般使用随机数用rand函数,rand函数有很多缺点。现在标准库引入了新的随机数引擎,对于生产随机数更加方便且功能强大了。它一般由引擎+分布类型的方式来生成随机数。头文件#include <random>直接用引擎生成随机数:#include<bits/stdc++.h>using namespace std;int main(){ defaul...原创 2019-11-14 10:46:17 · 98 阅读 · 0 评论 -
bitset
bitset初始化:#include<bits/stdc++.h>using namespace std;int main(){ unsigned long long x=0x3f3f3f3f; string s="0000011111"; bitset<5> b1; bitset<64> b2(x); bitset...原创 2019-11-13 15:42:55 · 172 阅读 · 0 评论 -
typedef typename std::vector<T>::size_type size_type;
http://feihu.me/blog/2014/the-origin-and-usage-of-typename/我服了 我不学了 我背下来。搞历史真心难原创 2019-11-08 15:58:32 · 527 阅读 · 0 评论 -
模板与泛型编程1(函数模板)
定义、实例化函数模板:对于函数体完全相同,唯一差异就是参数类型的情况,我们可以定义一个通用的函数模板,而非为每个类型都定义一个新函数:#include<bits/stdc++.h>using namespace std;template <typename T> int cmp(const T&v1,const T&v2){ if(v1<...原创 2019-11-06 23:55:33 · 122 阅读 · 0 评论 -
继承的作用域,继承的构造函数,构造函数和拷贝控制
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内。如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义在编译时进行名字查找:一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的,即使静态类型与动态类型不一致:#include<bits/stdc++.h>using namespace std;class A{prot...原创 2019-11-06 21:58:17 · 241 阅读 · 0 评论 -
虚函数,抽象基类,公有、私有和受保护继承,派生类向基类转换的可访问性
对虚函数的调用可能在运行时才被解析:当某个虚函数通过指针或引用调用时,编译器产生的代码直到运行时才能确定应该调用哪个版本的函数。被调用的函数是与之绑定到指针或引用上的对象的动态类型相匹配的那一个#include<bits/stdc++.h>using namespace std;class A{public: virtual void print(){ ...原创 2019-11-05 21:46:11 · 397 阅读 · 0 评论 -
定义基类和派生类
数据抽象是一种依赖于接口和实现分离的编程技术。继承和动态绑定对程序的编号有两方面的影响:一是我们可以更容易地定义与其它类相似但不完全相同的类;二是在使用这些彼此相似的类编写程序时,我们可以在一定程度上忽略掉它们的区别。定义鸡肋:#include<bits/stdc++.h>using namespace std;class Quote{public: Quote()=...原创 2019-11-05 20:25:09 · 1703 阅读 · 0 评论 -
运算符重载
不能重载的运算符有:. 和 :: 和 ?:和.*和sizeof注意点1:使用运算符重载的本质上是一次函数调用,所以这些关于运算对象的求值顺序无法应用到重载的运算符上。友元函数和成员函数的使用场合:一般情况下,建议一元运算符使用成员函数,二元运算符使用友元函数1、运算符的操作需要修改类对象的状态,则使用成员函数。如需要做左值操作数的运算符(如 =,+=,++)2、运算时,有数和对象...原创 2019-11-04 20:07:12 · 122 阅读 · 0 评论 -
C++ 对象移动
在对象拷贝后就立即被销毁的情况下,移动而非拷贝对象会大幅度提升性能。以及像 IO 类或 unique_ptr 这样的类,包含不能被共享的资源,不能拷贝但可以移动。而标准库容器、string 和 shared_ptr 类既支持移动也支持拷贝右值引用:右值引用是 c++11 为了支持移动操作引入的。右值引用就是只能绑定到右值的引用。我们通过 && 而非 & 来获取右值引用。...原创 2019-11-04 17:45:40 · 814 阅读 · 0 评论 -
拷贝控制2(拷贝控制和资源管理/交换操作/动态内存管理)
为了定义拷贝构造函数和拷贝赋值运算符,我们首先必须确认此类型对象的拷贝语义。通常可以定义拷贝操作,使类的行为看起来像一个值或者像一个指针(即所谓的深拷贝和浅拷贝)类的行为像一个值,意味着它应该也有自己的状态。当我们拷贝一个像值的对象时,副本和原对象是完全独立的。改变副本不会对原对象有任何影响,反之亦然行为像指针的类则共享状态。当我们拷贝一个这种类的对象时,副本和原对象使用相同的底层数据。改变副...原创 2019-10-31 20:49:42 · 142 阅读 · 0 评论 -
C++拷贝
拷贝控制操作即对象的拷贝,移动,赋值和销毁。一个类通过拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋值运算符和析构函数来完成这些工作。拷贝和移动构造函数定义了当用相同类型的另一个对象初始化本对象时做什么。拷贝和移动运算符定义了将一个对象赋予同类型的另一个对象时做什么。析构函数定义了当此类型对象销毁时做什么。如果一个类没有定义这些拷贝控制成员,编译器会自动为它定义缺失的操作。不过,对于一些特殊...原创 2019-10-30 23:11:13 · 317 阅读 · 0 评论 -
动态内存2(动态数组)
在 c++11 中提供了两种一次分配一个对象数组的方法。其一是使用一种 new 表达式语法,其二是使用一个名为 allocator 的类。虽然通常我们更希望用容器来代替数组(使用容器的类可以使用默认版本的拷贝、赋值和析构操作。分配动态数组的类则必须定义自己版本的操作,在拷贝、复制以及销毁对象时管理所关联的内存)。#include <iostream>using namespace ...原创 2019-10-29 20:52:51 · 121 阅读 · 0 评论 -
C++动态内存与智能指针
静态内存用来保存局部 static 对象、类 static 数据成员 以及任何定义在函数之外的变量。栈内存用来存储定义在函数内部的非 static 对象。分配在静态或栈内存中的对象由编译器自动创建和销毁。对于栈对象,仅在其定义的程序块运行时才存在;static 对象在使用之前分配,在程序结束时销毁。除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存被称作自由空间或堆。程序用堆来存储动态分...原创 2019-10-29 17:39:31 · 119 阅读 · 0 评论 -
Forsaken喜欢独一无二的树 牛客
这个题太秀了卡自闭队友蔡哥树剖lca搞让我心心念念好几天原来是这么个玩意。https://ac.nowcoder.com/acm/contest/1221/H题意:给出一个n个点m条边的图,每个边有权值w,你可以删除一些边,使得剩下的边的最小生成树大小不变并且这个图的最小生成树是独一无二的。现在我们想要知道删除的边的权值和最小是多少?思路:要形成独一无二的最小生成树,那...原创 2019-10-28 16:40:38 · 129 阅读 · 0 评论 -
区间众数,分块
第一次过了一个洛谷黑题,区间众数洛谷:4168代码:#include<bits/stdc++.h>using namespace std;using ll =long long;const int M=4e4+5,K=210;struct Node{ll num,val;}p[K][K],e;ll d[M],n,m,blo,L[K],R[K],B[M],sum[...原创 2019-10-28 15:35:35 · 157 阅读 · 0 评论 -
关联容器
关联容器关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保持和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。和顺序容器一样的是,关联容器也是模板关联容器类型:按关键字有序保存元素map 关联数组:保存关键字-值对set 关键字即值,即只保存关键字的容器multimap 关键字可以重复出现的 map...原创 2019-10-27 22:45:20 · 193 阅读 · 0 评论 -
插入,流,反向,移动迭代器总结
除了为每个容器定义的迭代器之外,标准库在头文件 iterator 中还定义了额外几种迭代器。这些迭代器包括以下几种:插入迭代器这些迭代器被绑定到一个容器上,可用来向容器插入元素#include<bits/stdc++.h>using namespace std;int main(){ list<int>lis={1, 2, 3, 4, 5}; li...原创 2019-10-26 23:38:59 · 100 阅读 · 0 评论 -
lambda
lambda表达式:一个lambda表达表示一个可调用的代码单元,我们可以将其理解为一个未命名的内联函数。lambda 表达式:Lambda表达式完整的声明格式如下:[capture list] (params list) mutable exception-> return type { function body }各项具体含义如下:capture list:捕获外部变量列...原创 2019-10-26 18:37:51 · 103 阅读 · 0 评论 -
泛型算法
泛型算法本身不会执行容器的操作,它们只会运行于迭代器之上,执行迭代器的操作。因此算法可能改变容器中保存的元素,也可能在容器内移动元素,但永远不会直接添加或删除元素。有时当算法操作一个迭代器的时候,可能会添加或者删除元素,但是算法本身永远不会直接添加或者删除元素accumulate:#include<bits/stdc++.h>using namespace std;int m...原创 2019-10-25 15:42:48 · 99 阅读 · 0 评论 -
string 笔记
构建string的方法string s(cp) 其中 cp 是一个 char* 字符,且其必须以空字符结尾string s(cp, n) 此时 cp 不必以空字符结尾,但是 n 必须不大于 cp 的长度,否则该行为是未定义的string s(cp + a, b) 从 cp[a] 开始拷贝 b 个字符构造 s,注意不能越界string s(s2, pos) ...原创 2019-10-24 22:45:05 · 126 阅读 · 0 评论 -
顺序容器
本文借鉴多篇博客:https://www.cnblogs.com/geloutingyu/p/8284527.htmlhttps://www.cnblogs.com/QG-whz/p/5152963.html#label0https://blog.csdn.net/zhengqijun/article/details/81566109https://blog.csdn.net/weixin...原创 2019-10-24 21:28:25 · 183 阅读 · 0 评论 -
C++ string流笔记
sstream 头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,从 string 读取数据,就像 string 是一个 IO 流一样。istringstream 从 string 读取数据,ostringstream 向 string 写入数据,stringstream 既可以从 string 读取数据也可以向 string 写入数据。类似于 fstream,sst...原创 2019-10-24 16:42:09 · 84 阅读 · 0 评论 -
C++ 文件流笔记
除了继承自 iostream 类型的行为之外,fstream 中定义的类型还增加了一些新的成员来管理与流相关的文件。我们可以对 fstream,ifstream 和 ofstream 对象调用这些操作,但不能对其他 IO 类型调用这些操作: fstream fstrm;//创建一个未绑定的文件流.fstream是头文件fstream中定义的一个类型 fstream fstrm1(s);/...原创 2019-10-24 16:14:07 · 426 阅读 · 0 评论 -
C++ IO流学习笔记
IO 库类型和头文件:头文件 类型iostream istream,wistream 从流读取数据ostream,wostream 向流写入数据iostream,wiostream 读写流fstream ifstream,wifstream 从文件读取数据ofstream,wofstream 向文件写入数据fstream,wfstre...原创 2019-10-24 15:21:37 · 266 阅读 · 0 评论 -
C++第七章:类
类的用户是程序员,而不是最终的用户。定义在类内部的函数都是隐式的内联函数。类中成员变量的声明顺序,决定了成员变量的初始化顺序。成员函数可以定义在类内部也可以定义在类外部#include<bits/stdc++.h>using namespace std;struct temple{ void print(string x); string num,name;...原创 2019-10-24 14:05:58 · 309 阅读 · 0 评论 -
C++函数笔记
函数的调用需要完成两项工作:一、实参初始化对象的形参二、将控制权交给函数,主调函数中断,被调函数运行。函数的返回类型不能是数组。数组不可以做函数返值的原因在于,函数的返值是赋值传递的,而数组不可以进行简单赋值。也就是函数的返回值是简单的临时变量方法,所以不支持是数组。当然,函数不能返回函数,虽然不知道为什么,但是这样做值没有意义的。应该尽可能使用引用传递从而避免拷贝。再次探讨con...原创 2019-10-22 21:37:21 · 142 阅读 · 2 评论 -
C++ 显式类型转换static_case,const_cast,reinterpret_cast
#include<bits/stdc++.h>using namespace std;int main(){ //显式类型转换. int i=5; double j=static_cast<double> (j)/3;//等于告诉编译器:我知道这里有精度损失,但我就是要这么写, cout<<j<<endl; ...原创 2019-10-22 19:57:12 · 443 阅读 · 0 评论