文章目录

  • 1 智能指针的概述
  • 2 shared_ptr基础理解
  • 3 shared_ptr的初始化方式
    • 3.1 默认初始化
    • 3.2 配合 new的初始化
    • 3.3 shared_ptr错误使用方式
    • 3.4 使用std:: make_shared函数来初始化
  • 4 shared_ptr引用计数的增加和减少
  • 5 shared_ptr常用的成员函数
    • 5.1 use_count成员函数
    • 5.2 unique成员函数
    • 5.3 reset成员函数
  • 6 指定删除器和指向数组的问题
  • 7 shared_ptr带来的循环引用问题--weak_ptr解决方案
  • 8 unique_ptr的基本使用
  • 9 智能指针选取问题

1 智能指针的概述

毫无疑问,智能指针相比于普通的裸指针(也就是我们直接用 new出来的对象的指针)更加智能,最明确的体现在于,可以自动帮你管理内存泄漏的问题,也就是说是,使用智能指针,不需要你手动去delete一个指针;
简单的说:只能指针就是对普通的裸指针进行了一层包装,包装之后,就使得这个指针更加智能,能够自动在合适时间帮你去释放内存;

C++标准库提供了四种智能指针的使用:
std::auto_ptr; c++98就有的一种智能指针,但是现在被遗弃,完全被std::unique_ptr所取代;
下面三种都是C++11提供的新智能指针;
std::unique_ptr; 一种独占式智能指针,同一个时间内只能有一个指针指向该对象;
std::shared_ptr;多个指针可以指向同一个对象的指针;
std::weak_ptr;一种辅助std::shared_ptr指针而存在的;

使用智能指针时候,记得包含头文件#include<memory>


2 shared_ptr基础理解

shared_ptr指针用共享所有权的方式来管理所指向对象的生命周期的;也就是说:一个对象不仅可以被一个单独的shared_ptr所指向,也可以被多个shared_ptr所指向,多个shared_ptr相互协作,共同管理所指向对象的生命周期,当所指向对象不被需要时候,就把所指向对象释放掉它的内存。


而我们使用shared_ptr前:需要思考一个问题,所指向的对象是否需要多个指针所指向,也就是多个指针可以共享一个对象(多个指针指向同一份内存的意思);


shared_ptr管理内存的原理是:使用引用计数的方式。这种方式:可以在指向一份对象的最后一个智能指针shared_ptr不再需要指向该内存时候,就释放该对象的空间;
在这里插入图片描述

那我们思考一个问题:最后一个指向该对象内存的shared_ptr指针是什么时候才会销毁该对象内存空间
1.该shared_ptr指针被析构的时候,也就是该指针的生命周期结束时候;
2.这个shared_ptr指向其他对象的时候;


3 shared_ptr的初始化方式

我们要知道智能指针就是一个模板,本质智能指针是一个对象,之所以叫它为指针,因为该智能指针类里面重载了->运算符,使这个对象能够像指针一样,指向它所需要的内存;


3.1 默认初始化

所以智能指针的初始化方式就是和容器的初始化方式差不多:基本形式如下
shared_ptr<指向的类型>智能指针名
比如:

shared_ptr<string> p; //指向一个类型为string的智能指针p1,//这种方式为默认初始化,也就是会给智能指针赋值为nullptr;

3.2 配合 new的初始化

//指向一个类型为int类型的智能指针, 并且指向该对象的初始值为10;
shared_ptr<int> p1(new int(10)); 
//指向一个类型为int类型的智能指针, 并且指向该对象的初始值为0;
shared_ptr<int> p2(new int());

我们要知道,指向的对象的初始化方式使由该对象决定的,也就是new 后面的类型加上()里面的方式。


3.3 shared_ptr错误使用方式

shared_ptr<int> p = new int(10); //这种方式使错误的,因为shared_ptr是不支持隐式构造的;
//也就是说: = 号右边是 int* 类型, = 左边是 shared_ptr类型,类型不对应是不行;

对于智能指针作为返回值的方式也是:下面的方式也是不行

shared_ptr<int> fun(int x)
{return new int(x); //这种方式也是错误的,原因也是不支持隐式构造,也就是类型不对应
}

起始我们可以用普通的裸指针去初始化智能指针,但是这种方式是不被推荐的,最好不要使用:

int* p = new int();
shared_ptr<int> p1(p);

上面的方式没有错误,但是不建议这么使用


3.4 使用std:: make_shared函数来初始化

其实我们可以使用一个特别的函数模板make_shared的函数去初始化shard_ptr指针,这种方式初始化也是被认为最安全,最高效的一种分配方式.(ps:虽然我不知道高效在哪里,但是看书资料是这么说的)

make_shared返回值是指向该对象的shared_ptr指针。

//类似:shared_ptr<int> p (new int(10));
shared_ptr<int> p = std::make_shared<int>(100);//类似shared-ptr<string> p(new string(5,'a'));
shared_ptr<string> p = std::make_shared<string>(5,'a');//还可以结合 auto使用
auto p = std::make_shared<string>(5,'a'); //这种写法比较简洁

make_shared函数的参数,是根据指向对象的初始化方式的参数。


但是,使用make_shared函数来初始化,shared_ptr指针的话,那么该shared_ptr指针就无法自定义删除器了。(至于什么是删除器,后面再讲);


4 shared_ptr引用计数的增加和减少

我们知道shared_ptr是通过引用计数来管理指向对象内存空间的释放的。
那么只要shared_ptr的引用计数为0时候,那么就会自动释放指向该对象的内存空间;


//此时指向int类型的共享指针p1的引用计数为1
shared_ptr<int> p1 = std::make_shared<int>(10); 
//此时指向int类型的共享指针p2的引用计数为2,同时p1的引用计数也是2
auto p2(p1);

可以这么理解:指向同一份对象内存的每个shared_ptr都关联着一个引用计数,当有新的shared_ptr指向该同一份对象内存空间时候,那么所有指向该同一份内存对象的shared_ptr都会增加1个引用计数;
减少也是同理;


shared_ptr作为形参的引用计数理解,此时的形参不是引用的方式

void fun(shared_ptr<int> p ) 
{//代码逻辑//...
}int main()
{shared_ptr<int> p1(new int(10)); //引用计数有一个fun(p1); //当传参给fun函数形参p时候,在fun函数内部,形参还没销毁时候,//这个shared_ptr的引用计数就是2,当p出来作用域的时候,//那么引用计数就会减1,也就是说形参p是对象生命周期结束了,相当于引用计数没变化return 0;
}

所以总的来说,形参是赋值的方式接收实参的话,那么引用计数就是现+1后减1,相当于没变化;


那么也很容易理解另一种情况就是,以shared_ptr引用的方式去接收实参,引用计数就是实实在在的没发生变化;

void fun(shared_ptr<int>& p ) 
{//代码逻辑//...
}int main()
{shared_ptr<int> p1(new int(10)); //引用计数有一个fun(p1); //当传参给fun函数形参p时候,由于是引用的方式,所以引用计数没变,还是1,		return 0;
}

还有一种以返回值的方式:shared_ptr做函数的返回值,以值的方式接收返回值:
这种情况:分两种:

第一:当调用该函数时候,没有变量去接受该返回值,那么引用计数不变;其实这个不变,也算是变化的了,因为返回时候,相当于是赋值拷贝一份shared_ptr对象,那么这个赋值过去的share_ptr就会指向同一份对象的内存,此时引用计数就会+1,但是由于没有变量接收返回值,所以引用计数又减1,所以相当于没有变化;
第二:当调用该函数时候,有变量去接收返回值,那么引用计数+1;

//第一种情况:
shared_ptr<int> fun(shared_ptr<int>& p ) 
{//代码逻辑//...return p;
}int main()
{shared_ptr<int> p1(new int(10)); //引用计数有一个fun(p1); //没人接收fun函数返回值,引用计数还是1,		return 0;
}
//第2种情况:
shared_ptr<int> fun(shared_ptr<int>& p ) 
{//代码逻辑//...return p;
}int main()
{shared_ptr<int> p1(new int(10)); //引用计数有一个auto p2 = fun(p1); //有人接收,引用计数还是1,		return 0;
}



引用计数减少的情况:
第一:当指向同一份对象的shared_ptr指向另一个对象空间时候,此时引用计数就会减少

shared_ptr<int> p1(new int(10)); //引用计数为1
auto p2(p1); //引用计数为2,p1和p2都是2p2 = std::make_shared<int>(20); //此时p2的引用计数为1,是因为它指向了新的空间,//p1的引用计数为1,是因为p2指向了新的对象空间导致的;

第二:当shared_ptr的指针,离开了作用域后,调用自己的析构函数,此时,引用计数也会减少;

shared_ptr<int> p1(new int(10)); //引用计数为1
auto p2(p1); //引用计数为2,p1和p2都是2void fun()
{shared_ptr p3(p1); //引用计数为3shared_ptr p4(p2); //引用计数为4
}
//当p3,p4离开作用域后,引用计数又变为2了

5 shared_ptr常用的成员函数


5.1 use_count成员函数

use_count成员函数使用来统计有多少个shared_ptr指针指向同一份内存空间对象的;

shared_ptr<int> p1(new int(10));
int nums = p1.use_count(); //nums = 1此时有一个引用计数shared_ptr<int> p2(p1);
int nums = p2.use_count(); //nums = 2此时有一个引用计数shared_ptr<int> p3(p2);
int nums = p3.use_count(); //nums = 3此时有一个引用计数

有一个细节:就是shared_ptr的对象,用哪个调用use_count函数都是可以的,p1,p2,p3调用use-count都是可以的


5.2 unique成员函数

这个成员函数主要是判断:shared_ptr指针是否只有一个智能指针指向该对象,如果是:返回true,如果不是:返回false;

shared_ptr<int> p1(new int(10));if(p1.unique()) //此时条件成立,因为只有一个引用计数
{//输出这个结果cout<<"只有一个shared_ptr指针指向同一份内存空间"<<endl;
}else
{cout<<"多个shared_ptr指向同一份内存空间"<<endl;
}shared_ptr<int> p2(p1);if(p1.unique()) //此时不成立条件成立,因为只有2个引用计数
{cout<<"只有一个shared_ptr指针指向同一份内存空间"<<endl;
}else //输出这个结果
{cout<<"多个shared_ptr指向同一份内存空间"<<endl;
}

5.3 reset成员函数

reset成员函数就是重置shared_ptr指针的的意思。

reset成员有两个重载版本: 第一个无参数的版本:重置该shared_ptr为空,同时引用计数减一,如果减到0就释放指针指向的内存空间;
第二个有参数的版本:重置shared_ptr指向为该参数的内存空间对象中,并且原来的内存空间对象的引用计数减一,如果减到0那么就释放该内存空间;


无参数的reset函数

shared_ptr<int> p1(new int(10)); //引用计数为1
p1.reset(); //p1指向空,由于引用计数会减一,减了之后变为0,就释放了该内存

shared_ptr<int> p1(new int(10)); //引用计数为1
shared_ptr p2(p1); //引用计数为2
p1.reset(); //p1指向空,由于引用计数会减一,减了之后变为1,p2的引用计数为1,P2指向的内存空间没有被释放

有参数的版本reset函数

shared_ptr<int> p1(new int(10)); //引用计数为1
p1.reset(new int(20)); //p1指向新开辟的对象内存空间,由于引用计数会减一,//所以原来P1指向的对象的内存空间被 释放了

shared_ptr<int> p1(new int(10)); //引用计数为1
shared_ptr p2(p1); //引用计数为2
p1.reset(new int(20)); //p1指向新开辟的对象内存空间,由于引用计数会减一,//减了之后变为1,p2的引用计数为1,P2指向的内存空间没有被释放

6 指定删除器和指向数组的问题

C++的智能指针初始化的第二个参数,可以指定自定义的删除器,其实这个删除器就是一个函数指针,并且是单参数的函数指针,当然,你也可以传lambda表达式。
如果不指定第二个初始化的参数,那么就是使用默认的删除器,也就是直接delete的版本;


为什么要指定自己的删除器呢?
因为智能指针在管理数组指针时候,需要释放数组的内存,假如使用默认的删除器,也就是直接delete,那么就会导致内存泄漏了,所以需要自己指定自己删除器,去释放数组内存;


class A
{
public:A(){cout<<"A()构造函数执行"<<endl;}~A(){cout<<"A()析构函数执行"<<endl;}
};int main()
{//shared_ptr<A> p(new A[10]); //试图开辟10个A类的数组空间,用智能指针P去指向它;//但是这会报错,报错原因就是默认删除器使用的delete p,//这样只能析构一个数组元素,剩下的9个没有析构成功//而我们需要的是delete[]p的方式释放内存,所以要自己指定删除器shared_ptr<A> p(new A[10],[](A* p){delete[] p;}); //用lambda表达式指定删除器//这样就可以释放干净数组的内存了//其实,删除器还有一种是C++ 标准库提供的类模板std::default_delete//这种方式也可以用来删除数组shared_ptr<A> p2(new A[10], std::default_delete<A[]>());return 0;
}

在C++17提供了一种更加方便的方式来管理数组的,但是这种在C++11 和14都是不支持的,所以可能老的编译器会报错.

只在<>尖括号 和()小括号里面的类型都加上[ ]中括号即可。

shared_ptr<A[]> p(new A[10]); //c++17就开始支持这种写法来管理数组

7 shared_ptr带来的循环引用问题–weak_ptr解决方案

什么是循环引用?什么又是weak_ptr;

什么是weak_ptr指针
1.首先我们得知道weak_ptr:是一种辅助shared_ptr的智能指针;
也就是说,weak_ptr本身是不可以被单独使用的
不可以被单独使用的意思:weak_ptr<int> p(new int(10)) 这种方式是不可以创建weak_ptr对象的,这是错误的用法;
2.weak_ptr的对象只能指向一个由shared_ptr创建的对象,但是weak_ptr是不管理shared_ptr指针指向的对象内存的空间生存周期的;这个weak_ptr是不会增加shared_ptr的引用计数的。
也就是说shared_ptr所指向的对象该释放空间就释放空间,和weak_ptr没有关系,尽管weak_ptr还是指向该对象的内存空间,只要shared_ptr的引用计数为0,那么就会释放该对象内存空间;


我们知道weak_ptr就是用来辅助shared_ptr使用的,那么是如何辅助呢?
首先我们得认识什么是循环引用得问题。
那么我们现来设一个场景类:一个人类,有一辆车;一个车类,需要有一个人;

在People类设计一个成员变量 shared_ptr<Car>类型的指针;
在Car类设计一个成员变量 shared_ptr<People>类型的指针;

#include<iostream>
#include<memory>
using namespace std;class Car; //前置声明,使得People类里面认识Car类
class People
{
public:shared_ptr<Car> _car;People(){cout << "People的构造函数执行" << endl;}~People(){cout << "People的析构函数执行" << endl;}
};
class Car
{	
public:shared_ptr<People> _people;Car(){cout << "car的构造函数执行" << endl;}~Car(){cout << "car的析构函数执行" << endl;}};
void test()
{shared_ptr<People> people(new People()); //开辟 People的堆空间shared_ptr<Car> car(new Car()); //开辟 Car的堆空间//再让类里的成员变量互相指向对方的shared_ptr指针people->_car = car;  //这会使得指向 car 对象的shared_ptr有2个引用计数car->_people = people;//这会使得指向 People 对象的shared_ptr有2个引用计数
}
int main()
{test();return 0;
}

一旦我调用上面的test函数,你猜会输出什么结果?是否由正常的两次构造函数,和两次析构函数的调用呢?
在这里插入图片描述
很明显,当我执行这行代码的时候,并没有显示正确的两次析构函数,也就是说,这段代码出现了一个很严重的问题,那就是内存泄漏了。


这个也是循环引用带来的问题,导致内存泄漏,那么我们总结以下什么是循环引用呢?
也就是shared_ptr管理资源内存时候,互相指向的问题,你的shared_ptr指向我的sahred_ptr,我的shared_ptr又指向你的shared_ptr;
画个图更好理解上面的代码
在这里插入图片描述
我们能够很清晰的看到,这里有一个循环的圈子在相互引用这,当我们的people和car 的共享指针声明周期结束时候,也就是在栈空间销毁时候,就会导致共享指针的引用计数减1,但是我们发现仅仅是减1,没有减到0,在堆空间中还是有成员变量的共享指针相互指向对方,这就导致了对象的空间没有被释放的问题;导致了析构函数无法被执行;
在这里插入图片描述


那么我们如何解决这个问题呢?
其实很好解决,只要通过weak_ptr来解决即可,只要在任意一个类中把shared_ptr换成weak——ptr就可以解决循环引用带的问题了,其他代码都不需要变动。

比如我在People类中修改了shared_ptr<Car> _carweak_ptr<Car> _car,当然你也可以在Car类修改,只要修改其中一个就可以了;

#include<iostream>
#include<memory>
using namespace std;class Car; //前置声明,使得People类里面认识Car类
class People
{
public:weak_ptr<Car> _car; //修改了成了weak_ptrPeople(){cout << "People的构造函数执行" << endl;}~People(){cout << "People的析构函数执行" << endl;}
};
class Car
{	
public:shared_ptr<People> _people;Car(){cout << "car的构造函数执行" << endl;}~Car(){cout << "car的析构函数执行" << endl;}};
void test()
{shared_ptr<People> people(new People()); //开辟 People的堆空间shared_ptr<Car> car(new Car()); //开辟 Car的堆空间//再让类里的成员变量互相指向对方的shared_ptr指针people->_car = car;  //这里并不会使得new 的car对象引用计数变为2,依旧是1,因为这是个weak_ptr指针car->_people = people;//这会使得指向 People 对象的shared_ptr有2个引用计数
}
int main()
{test();return 0;
}

查看结果:达到我们的预期,成功释放内存
在这里插入图片描述


那么原理是什么呢? 原理很简单,画个图就明白了
在这里插入图片描述
一旦栈空间的car共享指针离开作用域,那么就会就会释放 new Car对象,因为new Car的共享指针car只有1个引用计数,那么new Car对象就会调用自己的析构函数,一旦调用自己的析构函数,那么就导致new Car对象里面成员变量_people共享指针的引用计数少1,由于在栈空间people的共享指针也离开作用域,那么也就是说new People的共享指针引用计数也会少1,如此一来,由原来的两个引用计数变成0,那么就会释放 new People的空间了.


8 unique_ptr的基本使用

unique_ptr指针就是一种独占式的指针,也就是说,执行一个对象内存时候,只能有一个unique指针指向,不可以有多个;


所以说:基本没什么区别和shared_ptr的用法,那我们只要来分析一些常见的错误即可;

不可以拷贝构造;
不可以赋值初始化;
不可以赋值拷贝;

unique_ptr<string> p1(new string("hello world!"));//以下三种赋值方式都不行,因为这是一个独占式指针,只能有一个指针指向该对象string的内存单元;
unique_ptr<string> p2(p1);
unique_ptr<string> p3 = p1;
unque_ptr<string> p4;
p4 = p1;

C++ 14还提供一种使用make_unique的函数模板进行初始化unique_ptr指针的,但是C++11是不支持这种写法的

unique_ptr<int> p = std::make_unique<int>(100);

9 智能指针选取问题

假如程序中要使用多个指针指向同一个对象,选用shared_ptr;
假如程序中要使用单个指针指向同一个对象,选用unique_ptr;


查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. IntelliJ IDEA优缺点

    以下是比较eclipse后得出的结论 intj缺点: 没有向上复制一行,只有向下 没有支持系统文件内容搜索的插件 没有选择文件夹在指定选择的文件夹们中搜索内容功能 没有复制限定名功能(或复制的内容和eclipse不同,已自己研发ice-cp-path插件) 没有派生资源的概念,File搜索时不能过滤…...

    2024/4/13 11:41:30
  2. 数值型(Math、Random、BigInteger、BigDecimal)

    随机数 double d Math.random(); //返回0-1的随机数&#xff0c;不包括1 //返回x范围的随机整数&#xff0c;不包括x Random random new Random(); int i random.nextInt(x); //返回0-9随机数 int i random.nextInt(10);BigInteger 大整数类 BigInteger常用方法&#xff…...

    2024/4/18 5:28:50
  3. 量子信息瞬时传递现象的一种解释方案

    摘要&#xff1a;利用狭义相对论推导出同一参考系异地同时不确定性存在的可能性&#xff0c;实现逻辑上的自洽&#xff0c;为逻辑基础&#xff0c;然后分析时间不确定性在现实中存在的物理基础。在这两个基础之上利用异地同时不确定性分析量子纠缠信息瞬时传递现象的原理&#…...

    2024/4/16 21:35:06
  4. python中from turtle import * 引入turtle库失败的问题

    今天学习绘制五角星引入turtle失败的问题 这是程序 出现此报错 解决方案&#xff1a; 点击菜单里配置选项 选择python解释器&#xff0c;把默认解释器改为自定义&#xff0c;选择anaconda文件夹里的python.exe文件&#xff0c;确认后关闭软件重新打开&#xff0c;就可以运行了…...

    2024/4/13 11:41:30
  5. Zlib1.2.11及minizip源码编译(Win10+VS2022)

    Zlib1.2.11源码编译可参见文档 Zlib1.2.11源码编译&#xff08;Win10VS2019&#xff09;_Alexabc3000的专栏-CSDN博客 基于上述文档所介绍的内容&#xff0c;minizip的源码编译方法如下。 zlibvc项目编译 在目录“D:\SourceCodes\zlib-1.2.11\contrib\vstudio\vc14”中有名为…...

    2024/4/13 11:41:20
  6. vue 引入 day.js

    安装 npm install dayjs --save main.js中 import dayjs from dayjs Vue.prototype.$dayjs dayjs...

    2024/4/5 2:36:55
  7. vscode本地调试

    { "name": "使用本机 Chrome 调试", "type": "chrome", "request": "launch", "file": "${file}", "sourceMaps": true, "webRoot": "${workspaceRoot}"…...

    2024/4/5 2:36:54
  8. SKNet: Selective Kernel Networks

    论文 Selective Kernel Networks We propose a dynamic selection mechanism in CNNs that allows each neuron to adaptively adjust its receptive field size based on multiple scales of input information.However, some other RF properties of cortical neurons have n…...

    2024/4/7 22:09:18
  9. 二十 二十一.20220209学员作业

    1.判断题 1.1 在C语言中字符串可以使用关系运算符比较相等 &#xff08;?&#xff09; 1.2 strcpy_s()函数中第二个参数指的是缓冲区字节的数量 (?) 1.3 strlen()函数计算的是字符的长度而不是字节的大小 (?) 1.4 sprintf()和printf() 都是把格式化的字符串输出到控制台…...

    2024/4/7 22:09:17
  10. Anaconda安装问题

    Anaconda安装问题 一、报错 TypeError: handle_get_file_code() got an unexpected keyword argument ‘save_all’ 问题&#xff1a;升级了spyder到4.1.4 解决&#xff1a;重新卸载安装 install spyder-kernels1.9.3即可...

    2024/4/19 5:43:03
  11. 时隔两年,重新开始QAQ

    从零开始“复习”JS2022-02-07笔记&#xff08;b站千峰前段开发教程&#xff09; 1.BOM&DOM&ECMAscript BOM 操作浏览器DOM 操作文档流ECMAScript 书写规则 2.书写位置 行内式 a标签 <a href"javascript:alert(这是a标签的行内js);">这是a标签<…...

    2024/4/13 11:42:25
  12. ​每日一题- 剑指 Offer 28. 对称的二叉树​

    目录 描述 思想&#xff1a;递归 代码 描述 请实现一个函数&#xff0c;用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样&#xff0c;那么它是对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这…...

    2024/4/15 0:09:04
  13. VMware Workstation虚拟机安装CentOS7详细教程

    VMware Workstation虚拟机安装CentOS7详细教程 1.去官网下载VMware Workstation(我这是16)&#xff1a; 2.去官网下载centos7镜像文件(我这选择的是清华的)&#xff1a; 3.打开安装好的VMware Workstation(许可证的话&#xff0c;咳咳&#xff0c;最近感冒了)&#xff1a; …...

    2024/4/17 20:46:31
  14. IntelliJ IDEA插件开发

    1.新建项目 通过File->New->Project->选择插件项目建立即可(这里注意Project SDK设置为Intj的安装目录即可,需要版本对应的Jdk哦) 2.在网上下载一个插件,并根据插件内容进行编码,然后进行调试,调试方式如下: Run->Edit Configurations->Plugin->新建一个比如…...

    2024/4/13 11:42:25
  15. 删除排序链表中的重复元素

    题目描述 解题思路一 如果头结点为NULL&#xff0c;则直接返回head&#xff0c;不为NULL则进行如下操作&#xff1a; 定义一个指针 h 指向 head 判断 h 的指针域即其指向的下一结点是否为空&#xff0c;若为空则返回 head &#xff0c;不为空则继续执行下面的操作 判断 h 的…...

    2024/4/7 22:09:11
  16. 新年第一题

    2155. 分组得分最高的所有下标 给你一个下标从 0 开始的二进制数组 nums &#xff0c;数组长度为 n 。nums 可以按下标 i&#xff08; 0 < i < n &#xff09;拆分成两个数组&#xff08;可能为空&#xff09;&#xff1a;numsleft 和 numsright 。 numsleft 包含 nums…...

    2024/4/13 11:42:30
  17. IntelliJ IDEA安装插件

    所有插件可以在settings->plugins搜索进行安装,也可以直接上https://plugins.jetbrains.com/idea搜索并下载在工具然后insall plugin from disk(可以选择zip(内部有很多jar的话选择这个)或jar的) Lombok(必装) // 不用再写Setter,Getter Shifter(必装) // 反转插件(如css样式…...

    2024/4/14 20:45:02
  18. f2pool E池 低延迟 稳定 快速解决

    上面有f2pool和ethermine 很简单一分钟学会&#xff0c;这里就重新复述一遍轻松的如何设置。 1点击主矿池旁边箭头&#xff0c;点击添加 2 名字随便填&#xff0c;矿池地址我这里选择的是本网站E池地址e.eth8.cn:3030&#xff0c;然后点确认 点击主矿池旁小箭头&#xff0c;…...

    2024/4/13 11:42:30
  19. 数组:移除元素,快慢指针,数组覆盖

    leetcode:27 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…...

    2024/4/19 8:47:53
  20. 【YBTOJ进阶训练指导】划分数列【递推】

    思路&#xff1a; 简单DP&#xff0c;0表示i在上升序列中&#xff0c;1表示在下降序列中&#xff0c;动手推推就好了 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, a[1010100]; int f[1010000][2];int main() {scanf("%d&qu…...

    2024/4/13 11:42:15

最新文章

  1. 微信小程序日期增加时间完成订单失效倒计时(有效果图)

    效果图 .wxml <view class"TimeSeond">{{second}}</view>.js Page({data: {tiem_one:,second:,//倒计时deadline:,},onLoad(){this.countdown();},countdown(){let timestamp Date.parse(new Date()) / 1000;//当前时间戳let time this.addtime(2024…...

    2024/4/20 6:31:50
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 01背包问题 小明的背包

    2.小明的背包1 - 蓝桥云课 (lanqiao.cn) #include <bits/stdc.h> using namespace std; const int N1010;//开始写的105 开小了 样例过了但最后只过了很少一部分 int n,m; int v[N],w[N]; int f[N][N];int main() {cin>>n>>m;for(int i1;i<n;i){cin>&…...

    2024/4/19 3:30:04
  4. 【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

    作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…...

    2024/4/17 3:18:46
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/19 14:24:02
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/19 18:20:22
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/19 11:57:31
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/19 11:57:31
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/19 11:57:52
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/19 11:57:53
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/19 11:58:14
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/19 11:58:20
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/19 23:45:49
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/19 11:58:39
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/19 11:58:51
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/20 3:12:02
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/19 11:59:15
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/19 11:59:23
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/19 11:59:44
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/19 11:59:48
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/19 12:00:06
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/19 16:57:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/19 12:00:25
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/19 12:00:40
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57