c++
不想讀研的研究僧
这个作者很懒,什么都没留下…
展开
-
米哈游笔试(9/12)
1.括号匹配(100%)//// Created by Administrator on 2021/9/12 0012.//#include<iostream>#include<stack>using namespace std;int func(string& s){ if(s.size() == 0) return 0; int result = 0; stack<char> stack_s; stack_原创 2021-09-12 22:18:30 · 1370 阅读 · 2 评论 -
c++ 函数重载,函数重写(覆盖)以及函数隐藏(函数重定义)
1.函数重载; 作用域:函数重载的两个函数在同一个作用域中(即在同一个类中) 特点:函数重载的两个同名函数的形参一定不一样(参数个数,参数类型,参数顺序)。返回值不同而形参一致不能算作重载。 举例:class A{//函数重载public: void test(int i){cout<<i<<endl;} int test(int i,int j){cout<<i<<end...原创 2021-09-02 15:12:26 · 340 阅读 · 0 评论 -
快速排序的非递归实现
非递归的实现一般都是基于栈实现。代码:#include <iostream>#include<vector>#include<stack>using namespace std;int parti(vector<int>& vec,int begin,int end){ int i = begin; int j = end; int x = vec[begin]; while(i<j){原创 2021-08-28 16:23:20 · 96 阅读 · 0 评论 -
c++ const的用法
const是一个限定关键字,定义时必须进行初始化,且值不能发生改变1.const修饰基本数据类型,表示该变常量,不能再修改2.const修饰指针。当const在*之前,表明这是一个指向常量的指针变量;当const在*之后,表明只是一个指向变量的常指针;当*前后都有const,那么这是一个指向常量的常指针。3.const修饰引用。如果const在&之前,表明这是一个常引用,不能修改;如果const在&之后,不会有影响。4.const修饰函数。当const修饰指针参数,表示该参数原创 2021-08-11 16:32:42 · 92 阅读 · 0 评论 -
c++ 内存对齐
为什么要内存对齐? 现代计算机的内存空间都是以字节为单位进行划分的,而处理器的读取却不是以字节为单位,而是以双字节,四字节等,为了能更方面的读取,引出了内存对齐。 我们可以使用#pragma pack(n)来定义有效对齐值内存对齐的规则: (1)结构体中第一个成员的偏移量为0,后边每一个成员相对于结构体首地址的偏移量为该数据大小和有效对齐值较小的那个的倍数。如果有需要编译器可以在成员之间用字节自动补齐。 (2)结构体总的大小为有效对...原创 2021-08-11 15:30:23 · 86 阅读 · 0 评论 -
c++开辟两个线程交替输出a~z
代码:#include<iostream>#include<thread>#include<mutex>using namespace std;mutex my_mutex;char num = 'a';const int max_num = 10;void PrintOdd(){ my_mutex.lock(); while(1){ if(num>'z'){my_mutex.unlock();break;}原创 2021-08-09 13:58:07 · 263 阅读 · 0 评论 -
c++ 使用信号量进行同步和互斥操作
头文件:#include<semaphore.h>定义了结构体sem_t;相关函数:(1)sem_init (sem_t *sem, int pshared, unsigned int value); 这个函数的作用是对sem_t指定信号量进行初始化。第一个参数是结构体sem_t,;第二个参数是设置它的共享选,如果该参数的值为0,表示不能共享信号量,反之可以共享;第三个参数指定信号两百的初始值。(2)sem_wait(sem_t * sem);...原创 2021-08-09 11:30:56 · 833 阅读 · 0 评论 -
为什么类模板一般都是放在同个.h文件中
1.首先对于一个类模板来说如果一个类模板的成员函数的声明在test.h文件,而它的定义放在一个test.cpp文件,而在main.cpp文件中生成一个该类模板的实例化对象,该类的对象调用这个成员函数。这个时候就会出错。下面通过一个例子来说明这个情况。---------------------test.h-------------------template<class T>class A{ public: void f(); private: T a; };-.原创 2021-07-27 17:34:35 · 1305 阅读 · 0 评论 -
c++ stl vector为什么两倍扩容?如何释放内存?
要解释为什么要两倍扩容我们可以分两步理解?1.为什么选择成倍扩容,而不是成等差扩容?(1)我们假设我们使用m扩容,一共有n个元素,那么我们需要扩展多少次才能装下这n个元素,通过计算我们可以得到:,那么我们需要拷贝多少个元素呢?这个式子可以看出来总的时间复杂度为n,当平均分摊到每个元素上,时间复杂度为常数。(2)我们假设使用每次增加一个固定的常数m来扩容,总的元素个数是n,那么我们需要扩展多少次才能装下这n个元素,通过计算我们可以得到:,,那么我们需要拷贝多少个元素呢?这个式子可以原创 2021-07-27 09:57:59 · 1843 阅读 · 0 评论 -
什么是组合
组合的定义:如果一个类中的成员对象是另外一个类的对象,即嵌套其他类的对象作为自己的成员。创建类对象,调用构造函数的顺序,首先调用各个内嵌对象的构造函数(按照各个嵌套对象在组合类的定义顺序),接下来调用组合类的构造函数,析构函数的顺序正好相反。...原创 2021-07-26 21:11:05 · 532 阅读 · 0 评论 -
类如何只能静态分配和只能动态分配
1.首先讲解一下什么是类对象的静态分配和动态分配。类对象的静态分配:例如 A a;这个方式是由编译器在编译阶段完成的,主要是通过直接移动栈顶指针,挪出适当的空间,然后在这个 内存空间上调用构造函数形成一个栈对象。也就是说直接调用类的构造函数来生成一个类对象。类对象的动态分配:例如:A* a = new A();编译器对于类对象的内存分配是在运行时动态分配的,使用new产生的对象会建立在堆区。这个过程分为两步进行:(1)执行函数operator new()函数,找到合适的内存进行分配。(2)调原创 2021-07-26 18:42:58 · 1417 阅读 · 0 评论 -
c++ emplace_back()和push_back()的区别
emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。#include <vector> #include <iostream> using namespace std;clas原创 2021-07-26 15:41:49 · 567 阅读 · 4 评论 -
c++11新特性之 右值引用
1.首先说一下什么是左值和右值左值就是可以取地址 变量;右值不可取地址的变量。2.什么是引用?引用本质是别名,通过引用可以修改变量的值。传递参数时可以避免拷贝。3.什么是左值引用(左值变量前面取&)能指向左值,不能指向右值的引用就是左值引用。int a = 10;int &b = a;int &c = 10;//错误,左值引用指向了右值当然也是可以通过const来指向右值:const int &c = 10;//编译通过const'原创 2021-07-26 15:25:47 · 314 阅读 · 0 评论 -
c++ 11新特性 之 lambda表达式
一、函数对象:先讲一下什么是函数对象,函数对象本质上是一个类,只不过这个类实现了对小括号()的重载,可以像使用函数那样的使用这个类生成的对象,因此被称为函数对象:例子:class test{public: int operator()(int a,int b){ return a+b; }};int main(){ test t; int a = t(1,2); cout << a << endl;}原创 2021-07-26 12:43:04 · 129 阅读 · 0 评论 -
详谈c++中的虚函数
概念:虚函数虚函数表虚函数表指针多态特性的体现1.虚函数引入之后类的变化: 首先创建一个空类A,以及类A的对象aclass A{ };A a;cout << sizeof(a) << endl;我们执行结果是1,//空类的对象也会占用内存空间class A{ void func1(){}; void func2(){};};A a;cout << sizeof(a) <&l...原创 2021-07-23 19:02:56 · 219 阅读 · 2 评论 -
二叉树的先序,中序以及后序遍历(非递归实现)
二叉树的先序遍历(非递归)vector<int> FisrtRoot(TreeNode* root){ vector<int> result; if(root == nullptr){ return result; } stack<TreeNode*> stack_r; stack_r.push(root); while(!stack_r.empty()){ TreeNode* temp = stack_r原创 2021-07-23 13:27:21 · 91 阅读 · 0 评论 -
kmp算法 (字符串匹配算法)
假设主 串是s,子串是t;(s.size() <t.size());首先我们需要求next[t.size()](至于为什么要求,可以参考其他的博文,有很多大佬总结的极其详细,我只是为了记录一下),next数组的作用:当我们遇到不相等的字符的时候,我们指向子串的指针应该指向什么地方。bool kmp(string s,sring t){ int num_s = s.size(); int num_t = t.size(); //求next数组 vector<原创 2021-07-22 10:09:35 · 79 阅读 · 0 评论 -
单调栈的用法
题目:496. 下一个更大元素 I给你两个没有重复元素的数组nums1和nums2,其中nums1是nums2的子集。请你找出nums1中每个元素在nums2中的下一个比其大的值。nums1中数字x的下一个更大元素是指x在nums2中对应位置的右边的第一个比x大的元素。如果不存在,对应位置输出-1。示例 1:输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释: ...原创 2021-07-09 16:02:22 · 66 阅读 · 0 评论 -
给定一个数组,找最大的相同连续数字或者是字符
题目:力扣485:给定一个二进制数组, 计算其中最大连续 1 的个数。示例:输入:[1,1,0,1,1,1]输出:3解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.提示:输入的数组只包含0 和 1 。输入数组的长度是正整数,且不超过 10,000。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/max-consecutive-ones著作权归领扣网络所有。商业转载请联系官方授..原创 2021-07-09 11:59:55 · 448 阅读 · 0 评论 -
c++ __builtin_popcount()函数-关于求出一个二进制中含有多少个1
例子:class Solution {public: vector<string> readBinaryWatch(int turnedOn) { vector<string> vec_s; for(int i = 0;i<12;++i){ for(int j=0;j<60;++j){ if(__builtin_popcount(i) + __builtin_popco原创 2021-07-06 21:51:03 · 178 阅读 · 0 评论 -
只出现一次的数字(字符)(利用异或求解)
首先,介绍异或运算的三个性质:1.任何数是和0的异或结果都是原来的数,即;2.任何数和其自身做异或运算,结果都是0,即;3.异或运算满足交换律和结合律,即:.由以上性质,我们可以知道,两个相同的数取异或操作结果为0。因此可以用来求只出现一次的数字(字符)。例1:题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,原创 2021-07-06 21:01:20 · 407 阅读 · 0 评论 -
c++ fork()函数
fork()函数会创建一个与当前进程影响一样的进程。fork()函数运行失败会返回一个负数;当运行成功时,子进程会返回0,父进程会返回子进程的进程号。例子:#include <iostream>#include<unistd.h>using namespace std;int main() { cout << "enter ...." << endl; pid_t pid = fork(); cout <&原创 2021-06-28 16:49:08 · 359 阅读 · 0 评论 -
c++ 基类的析构函数为什么要设置成虚函数
将可能被继承的类的析构函数设置成虚函数是为了:当将一个子类对象被指向一个基类指针的时候,当我们调用基类的析构函数时(释放基类的内存空间)可以同时释放掉子类的内存空间,防止内存泄漏。默认的类的析构函数不会设置成虚函数的原因是:构建虚函数需要一定的代价,需要一定的内存空间来存储虚函数表以及虚函数指针。当一个类不需要被继承,就会造成内存空间的浪费。因此,我们一般只将被继承的类的析构函数设置成虚函数。...原创 2021-06-28 16:16:40 · 834 阅读 · 0 评论 -
c++ 智能指针
1.auto_ptr:该指针在c++98中采用,cpp11已经弃用。2.unique_ptr:该指针实现独占式或者严格拥有概念,保证同一时间内只有一个智能指针指向该对象。使用方法:1.unique_ptr e1(new entity());2.unique_ptr e1 = make_unique();3.auto e1 = make_unique();4.unique_ptr e2 = move(e1);//此时e1是一个空指针,movable,transfer owner原创 2021-06-28 11:07:08 · 66 阅读 · 0 评论 -
c++ 指针和引用的区别
1.指针有一块属于自己的空间;引用只是一个别名。2.使用sizeod(),指针的大小的4;引用的大小为所指对象的大小。3.在作为传递参数时,指针需要被解引用才可以对对象进行操作;但是引用可以直接操作其所指的对象。4.指针可以为空,为空时可以被初始化为NULL;引用不可以为空,引用必须被初始化且初始化为一个对象的引用。5.指针可以是多级指针;引用只能是一级。6.指针可以指向其他对象;但是引用只能指向一个对象。7。可以有const指针,但是没有const引用。...原创 2021-06-07 16:22:49 · 86 阅读 · 0 评论 -
c++ 四种cast转换
1.const_cast:将const变量转换成非const2.static_cast:基本可以用于各种隐式转换,例如将const转换成非const等。static_cast可用于多态向上转换,如果向下转换成功但不安全。3.dynamic_cast:dynamic_cast是动态强制转换。用于转换包含虚函数的类,用于转换引用和指针。可以向上向下转换。向下转换时,如果非法对于指针返回null,对于引用抛出异常。向上转换:指的是从派生类向基类转换。向下转换:指的是从基类向派生类转换。原创 2021-06-05 17:47:37 · 277 阅读 · 2 评论 -
c++ static关键字的作用
1.全局静态变量:如果在一个全局变量之前添加static关键字,那么这个变量变成全局静态变量。作用域:全局静态变量作用于定义该变量到该文件结束。初始化:未进行初始化的全局静态变量会自动初始化为0;2.局部静态变量:如果在一个局部变量之前添加static关键字,那么这个变量变成一个局部静态变量。作用域:当定义该变量的函数或者是语句块结束时,该局部静态变量作用域结束。但是该变量并不会被销毁,只是我们不再去访问该变量,直到我们再一次调用定义它的函数,并且值不会改变。初始化:未进行初始化原创 2021-06-05 11:07:11 · 375 阅读 · 0 评论 -
c++ 快速排序
快速排序的思想(分治思想):给定一个待排序的序列,我们假设做升序处理。一次快速排序的思想是:将序列中的第一个元素作为基准数,将小于该基准数的元素放在左边,将大于该基准数的元素放在右边,这样就将这个基准数放在正确的位置。接下来再对左侧和右侧的序列分别进行快速排列。那么我们应该怎样实现一次快速排序呢?我们引入两个指针,一个指向序列的头(begin),一个指向序列的尾(end)。end指针从后往前遍历该序列,当碰到一个小于基准数的元素,将begin处的元素用该元素替换。begin指针从前往后遍历该序列原创 2021-06-03 20:57:39 · 84 阅读 · 0 评论 -
c++ 插入排序和归并(合并)排序
插入排序:插入排序思想:考虑第i个元素,这时候前i-1个元素是有序的,这时候只要将第i个元素放到合适的位置即可。伪代码:void InsertSort(vector<int>& a){ for(int i=1;i<a.size();++i){ int key = a[i]; int j = i-1; while(j>=0 && a[j] > key){ a[原创 2021-06-02 21:04:17 · 220 阅读 · 0 评论 -
动态规划 之 背包问题(框架)
背包问题是一个经典的动态规划问题。本文对背包的几个常见类型做一个总结。常见背包问题:01背包问题最基本的背包问题就是01背包问题:一共有N件物品,第i件物品的重量为w[i],第i件物品的价值为v[i]。在总重量不超过承载上限W的情况下,能够装入的背包的最大价值是多少?完全背包问题:完全背包与01背包不同点就是每件物品可以有无限多个:一共有N种物品,每种物品有无限多个,第i种物品的重量为w[i],价值为v[i]。在总重量不超过背包承载上限W的情况下,能够装入背包的最大价值是多少?可见0原创 2021-05-25 11:17:36 · 109 阅读 · 0 评论 -
c++ 字符串转换成int函数 atoi()和stoi()
相同点:1.都是c++的字符处理函数,把数字字符串转换成int输出不同点:1.头文件库不同:stoi()的头文件是<string>;而atoi()的头文件是<stdlib.h>2.atoi()的参数是const char*,因此对于一个字符串str我们必须先调用c_str()的方法把string转换成const char类型,而stoi()的参数是const string,不需要将其转换成const char*;int atoi (const char * st原创 2021-05-25 11:05:51 · 2201 阅读 · 0 评论 -
c++ rand()和 srand()
计算机的随机数都是伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。我们通常使用rand()函数来产生随机数,但是这并不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们将它称为种子)为基准以某个递推公式推算出来的。当这些数很多的时候,就符合正太分布,从而产生了随机数。但这并不是真正的随机数。1.rand()功能:随机数生成器。用法:int rand(void);所在的头文件:<stdlib.h>rand()的内部实现是用线性同原创 2021-04-23 15:29:42 · 140 阅读 · 0 评论 -
c++容器之unordered_map 哈希映射
参考链接:http://www.cplusplus.com/reference/unordered_map/unordered_map/?kw=unordered_map简单介绍:无序映射(unordered_map)是关联容器,用于存储由键值(key)和映射值(value)的组合形成的元素,并允许基于其键快速检索各个元素。在unordered_map中,键值通常用于唯一地标识元素,而映射值是具有与该键关联的内容的对象。键的类型和映射的值可能会有所不同。重要函数:(1)大小(Capacity):原创 2021-04-02 14:55:52 · 812 阅读 · 0 评论 -
力扣(LeetCode)168. Excel表列名称
题目:给定一个正整数,返回它在 Excel 表中相对应的列名称。例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB ...示例 1:输入: 1输出: "A"示例2:输入: 28输出: "AB"示例3:输入: 701输出: "ZY"来源:力扣(LeetCode)链接:https://leetcode-cn.com/pr...原创 2021-04-01 22:07:29 · 110 阅读 · 0 评论 -
c++ vector 构建二维数组
#include <iostream>#include <vector>using namespace std;int main (){ //二维数组初始化 vector<vector<int>> array2(5); for(int i=0;i < array2.size();++i) { array2[i].resize(3); } //输出二维数组 for(int i = 0 ;i <..原创 2020-10-29 11:16:36 · 227 阅读 · 0 评论 -
c++ STL记录
vector:https://blog.csdn.net/weixin_41743247/article/details/90635931原创 2020-10-23 14:13:01 · 76 阅读 · 0 评论