基础知识学习---牛客网C++面试宝典(四)C/C++基础之STL

news2024/11/26 4:32:55

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程;

2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等;
3、参加工作后(2021-2023年)岗位是嵌入式软件开发,主要是服务器开发,Linux、C/C++、网络编程、docker容器、CMake、makefile、Shell脚本、JSON等。

4、求职岗位是嵌入式软件开发、C/C++开发、自动驾驶岗位开发等。

在这里插入图片描述

此系列为在学习牛客网C++面试宝典过程中记录的笔记,本篇记录第一章C/C++基础部分的第四节:STL。

牛客网C++面试宝典链接:https://www.nowcoder.com/issue/tutorial?tutorialId=93&uuid=b36a4e16637540b48edebbe29a405eb8

文章目录

  • 4.1 请说说 STL 的基本组成部分
  • 4.2 请说说 STL 中常见的容器,并介绍一下实现原理
  • 4.3 说说 STL 中 map hashtable deque list 的实现原理
  • 4.4 请你来介绍一下 STL 的空间配置器(allocator)
  • 4.5 STL 容器用过哪些,查找的时间复杂度是多少,为什么?
  • 4.6 迭代器用过吗?什么时候会失效?
  • 4.7 说一下STL中迭代器的作用,有指针为何还要迭代器?
  • 4.8 说说 STL 迭代器是怎么删除元素的
  • 4.9 说说 STL 中 resize 和 reserve 的区别
  • 4.10 说说 STL 容器动态链接可能产生的问题?
  • 4.11 说说 map 和 unordered_map 的区别?底层实现
  • 4.12 说说 vector 和 list 的区别,分别适用于什么场景?
  • 4.15 C++ 的 vector 和 list中,如果删除末尾的元素,其指针和迭代器如何变化?若删除的是中间的元素呢?
  • 4.16 请你来说一下 map 和 set 有什么区别,分别又是怎么实现的?
  • 4.17 说说 push_back 和 emplace_back 的区别
  • 4.18 STL 中 vector 与 list 具体是怎么实现的?常见操作的时间复杂度是多少?

4.1 请说说 STL 的基本组成部分

参考回答

标准模板库(Standard Template Library,简称STL)简单说,就是一些常用数据结构和算法的模板的集合。

广义上讲,STL分为3类:Algorithm(算法)、Container(容器)和Iterator(迭代器),容器和算法通过迭代器可以进行无缝地连接。

详细的说,STL由6部分组成:容器(Container)、算法(Algorithm)、 迭代器(Iterator)、仿函数(Function object)、适配器(Adaptor)、空间配制器(Allocator)。

答案解析

标准模板库STL主要由6大组成部分:

1、容器(Container)

是一种数据结构, 如list, vector, 和deques,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。

2、算法(Algorithm)

是用来操作容器中的数据的模板函数。例如,STL用sort()来对一 个vector中的数据进行排序,用**find()**来搜索一个list中的对象, 函数本身与他们操作的数据的结构和类型无关,因此他们可以用于从简单数组到高度复杂容器的任何数据结构上。

3、迭代器(Iterator)

提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。 迭代器就如同一个指针。事实上,C++ 的指针也是一种迭代器。 但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符方法的类对象;

4、仿函数(Function object)

仿函数又称之为函数对象, 其实就是重载了操作符的struct,没有什么特别的地方。

5、适配器(Adaptor)

简单的说就是一种接口类,专门用来修改现有类的接口,提供一中新的接口;或调用现有的函数来实现所需要的功能。主要包括3种适配器Container AdaptorIterator AdaptorFunction Adaptor

6、空间配制器(Allocator)

为STL提供空间配置的系统。其中主要工作包括两部分:

(1)对象的创建与销毁;

(2)内存的获取与释放。

4.2 请说说 STL 中常见的容器,并介绍一下实现原理

参考回答

容器可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是模板类,分为顺序容器、关联式容器、容器适配器三种类型,三种类型容器特性分别如下:

1、顺序容器

容器并非排序的,元素的插入位置同元素的值无关。包含vector、deque、list,具体实现原理如下:

(1)vector 头文件

动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能。

(2)deque 头文件

双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成(仅次于vector)。在两端增删元素具有较佳的性能(大部分情况下是常数时间)。

(3)list 头文件

双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取。

2、关联式容器

元素是排序的;插入任何元素,都按相应的排序规则来确定其位置;在查找时具有非常好的性能;通常以平衡二叉树的方式实现。包含set、multiset、map、multimap,具体实现原理如下:

(1)set/multiset 头文件

set 即集合。set中不允许相同元素,multiset中允许存在相同元素。

(2)map/multimap 头文件

map与set的不同在于map中存放的元素有且仅有两个成员变量,一个名为first,另一个名为second, map根据first值对元素从小到大排序,并可快速地根据first来检索元素。

注意:map同multimap的不同在于是否允许相同first值的元素。

3、容器适配器

封装了一些基本的容器,使之具备了新的函数功能,比如把deque封装一下变为一个具有stack功能的数据结构。这新得到的数据结构就叫适配器。包含stack,queue,priority_queue,具体实现原理如下:

(1)stack 头文件

栈是项的有限序列,并满足序列中被删除、检索和修改的项只能是最进插入序列的项(栈顶的项)。后进先出。

(2)queue 头文件

队列。插入只可以在尾部进行,删除、检索和修改只允许从头部进行。先进先出。

(3)priority_queue 头文件

优先级队列。内部维持某种有序,然后确保优先级最高的元素总是位于头部。最高优先级元素总是第一个出列。

4.3 说说 STL 中 map hashtable deque list 的实现原理

参考回答

map、hashtable、deque、list实现机理分别为红黑树、函数映射、双向队列、双向链表,他们的特性分别如下:

map实现原理

map内部实现了一个红黑树(红黑树是非严格平衡的二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树有自动排序的功能,因此map内部所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找、删除、添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉树(又名二叉查找树、二叉排序树)存储的,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值。使用中序遍历可将键值按照从小到大遍历出来。

hashtable(也称散列表,直译作哈希表)实现原理

hashtable采用了函数映射的思想记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。这决定了哈希表特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。

deque实现原理

deque内部实现的是一个双向队列。元素在内存连续存放。随机存取任何元素都在常数时间完成(仅次于vector)。所有适用于vector的操作都适用于deque。在两端增删元素具有较佳的性能(大部分情况下是常数时间)。

list实现原理

list内部实现的是一个双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取。无成员函数,给定一个下标i,访问第i个元素的内容,只能从头部挨个遍历到第i个元素。

4.4 请你来介绍一下 STL 的空间配置器(allocator)

参考回答

一般情况下,一个程序包括数据结构和相应的算法,而数据结构作为存储数据的组织形式,与内存空间有着密切的联系。在C++ STL中,空间配置器便是用来实现内存空间(一般是内存,也可以是硬盘等空间)分配的工具,他与容器联系紧密,每一种容器的空间分配都是通过空间分配器alloctor实现的。

答案解析

1、两种C++类对象实例化方式的异同

在c++中,创建类对象一般分为两种方式:一种是直接利用构造函数,直接构造类对象,如 Test test();另一种是通过new来实例化一个类对象,如 Test *pTest = new Test;那么,这两种方式有什么异同点呢?

我们知道,内存分配主要有三种方式:

(1) 静态存储区分配:内存在程序编译的时候已经分配好,这块内存在程序的整个运行空间内都存在。如全局变量,静态变量等。

(2) 栈空间分配:程序在运行期间,函数内的局部变量通过栈空间来分配存储(函数调用栈),当函数执行完毕返回时,相对应的栈空间被立即回收。主要是局部变量。 (3)堆空间分配:程序在运行期间,通过在堆空间上为数据分配存储空间,通过malloc和new创建的对象都是从堆空间分配内存,这类空间需要程序员自己来管理,必须通过free()或者是delete()函数对堆空间进行释放,否则会造成内存溢出。

那么,从内存空间分配的角度来对这两种方式的区别,就比较容易区分:

(1)对于第一种方式来说,是直接通过调用Test类的构造函数来实例化Test类对象的,如果该实例化对象是一个局部变量,则其是在栈空间分配相应的存储空间。 (2)对于第二种方式来说,就显得比较复杂。这里主要以new类对象来说明一下。new一个类对象,其实是执行了两步操作:首先,调用new在堆空间分配内存,然后调用类的构造函数构造对象的内容;同样,使用delete释放时,也是经历了两个步骤:首先调用类的析构函数释放类对象,然后调用delete释放堆空间。

2、C++ STL空间配置器实现

很容易想象,为了实现空间配置器,完全可以利用new和delete函数并对其进行封装实现STL的空间配置器,的确可以这样。但是,为了最大化提升效率,SGI STL版本并没有简单的这样做,而是采取了一定的措施,实现了更加高效复杂的空间分配策略。由于以上的构造都分为两部分,所以,在SGI STL中,将对象的构造切分开来,分成空间配置和对象构造两部分。

内存配置操作: 通过alloc::allocate()实现 内存释放操作: 通过alloc::deallocate()实现 对象构造操作: 通过::construct()实现 对象释放操作: 通过::destroy()实现

关于内存空间的配置与释放,SGI STL采用了两级配置器:一级配置器主要是考虑大块内存空间,利用malloc和free实现;二级配置器主要是考虑小块内存空间而设计的(为了最大化解决内存碎片问题,进而提升效率),采用链表free_list来维护内存池(memory pool),free_list通过union结构实现,空闲的内存块互相挂接在一块,内存块一旦被使用,则被从链表中剔除,易于维护。

4.5 STL 容器用过哪些,查找的时间复杂度是多少,为什么?

参考回答

STL中常用的容器有vector、deque、list、map、set、multimap、multiset、unordered_map、unordered_set等。容器底层实现方式及时间复杂度分别如下:

1、vector

采用一维数组实现,元素在内存连续存放,不同操作的时间复杂度为:

插入: O(N)

查看: O(1)

删除: O(N)

2、deque

采用双向队列实现,元素在内存连续存放,不同操作的时间复杂度为:

插入: O(N)

查看: O(1)

删除: O(N)

3、list

采用双向链表实现,元素存放在堆中,不同操作的时间复杂度为:

插入: O(1)

查看: O(N)

删除: O(1)

4、map、set、multimap、multiset

上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种。不同操作的时间复杂度近似为:

插入: O(logN)

查看: O(logN)

删除: O(logN)

5、unordered_map、unordered_set、unordered_multimap、 unordered_multiset

上述四种容器采用哈希表实现,不同操作的时间复杂度为: 插入: O(1),最坏情况O(N)

查看: O(1),最坏情况O(N)

删除: O(1),最坏情况O(N)

注意:容器的时间复杂度取决于其底层实现方式。

4.6 迭代器用过吗?什么时候会失效?

参考回答

用过,常用容器迭代器失效情形如下。

1、对于序列容器vector,deque来说,使用erase后,后边的每个元素的迭代器都会失效,后边每个元素都往前移动一位,erase返回下一个有效的迭代器。

2、对于关联容器map,set来说,使用了erase后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素,不会影响下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可。

3、对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的迭代器,因此上面两种方法都可以使用。

4.7 说一下STL中迭代器的作用,有指针为何还要迭代器?

参考回答

1、迭代器的作用

(1)用于指向顺序容器和关联容器中的元素

(2)通过迭代器可以读取它指向的元素

(3)通过非const迭代器还可以修改其指向的元素

2、迭代器和指针的区别

**迭代器不是指针,是类模板,表现的像指针。**他只是模拟了指针的一些功能,重载了指针的一些操作符,-->++--等。迭代器封装了指针,是一个”可遍历STL( Standard Template Library)容器内全部或部分元素”的对象,本质是封装了原生指针,是指针概念的一种提升,提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,–等操作。

迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用取值后的值而不能直接输出其自身。

3、迭代器产生的原因

Iterator类的访问方式就是把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。

4.8 说说 STL 迭代器是怎么删除元素的

参考回答

这是主要考察迭代器失效的问题。

1、对于序列容器vector,deque来说,使用erase后,后边的每个元素的迭代器都会失效,后边每个元素都往前移动一位,erase返回下一个有效的迭代器;

2、对于关联容器map,set来说,使用了erase后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素,不会影响下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可;

3、对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的迭代器,因此上面两种方法都可以使用。

答案解析

容器上迭代器分类如下表(详细实现过程请翻阅相关资料详细了解):
在这里插入图片描述

4.9 说说 STL 中 resize 和 reserve 的区别

参考回答

1、首先必须弄清楚两个概念:

(1)capacity:该值在容器初始化时赋值,指的是容器能够容纳的最大的元素的个数。还不能通过下标等访问,因为此时容器中还没有创建任何对象。

(2)size:指的是此时容器中实际的元素个数。可以通过下标访问0-(size-1)范围内的对象。

2、resize和reserve区别主要有以下几点:

(1)resize既分配了空间,也创建了对象;reserve表示容器预留空间,但并不是真正的创建对象,需要通过insert()或push_back()等创建对象。

(2)resize既修改capacity大小,也修改size大小;reserve只修改capacity大小,不修改size大小。

(3)两者的形参个数不一样。 resize带两个参数,一个表示容器大小,一个表示初始值(默认为0);reserve只带一个参数,表示容器预留的大小。

4.10 说说 STL 容器动态链接可能产生的问题?

参考回答

1、可能产生 的问题

容器是一种动态分配内存空间的一个变量集合类型变量。在一般的程序函数里,局部容器,参数传递容器,参数传递容器的引用,参数传递容器指针都是可以正常运行的,而在动态链接库函数内部使用容器也是没有问题的,但是给动态库函数传递容器的对象本身,则会出现内存堆栈破坏的问题。

2、产生问题的原因 容器和动态链接库相互支持不够好,动态链接库函数中使用容器时,参数中只能传递容器的引用,并且要保证容器的大小不能超出初始大小,否则导致容器自动重新分配,就会出现内存堆栈破坏问题。

4.11 说说 map 和 unordered_map 的区别?底层实现

参考回答

map和unordered_map的区别在于他们的实现基理不同

1、map实现机理

map内部实现了一个红黑树(红黑树是非严格平衡的二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树有自动排序的功能,因此map内部所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找、删除、添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉树(又名二叉查找树、二叉排序树)存储的,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值。使用中序遍历可将键值按照从小到大遍历出来。

2、unordered_map实现机理

unordered_map内部实现了一个哈希表(也叫散列表),通过把关键码值映射到Hash表中一个位置来访问记录,查找时间复杂度可达O(1),其中在海量数据处理中有着广泛应用。因此,元素的排列顺序是无序的。

4.12 说说 vector 和 list 的区别,分别适用于什么场景?

参考回答

vector和list区别在于底层实现机理不同,因而特性和适用场景也有所不同。

vector:一维数组

特点:元素在内存连续存放,动态数组,在堆中分配内存,元素连续存放,有保留内存,如果减少大小后内存也不会释放。

优点:和数组类似开辟一段连续的空间,并且支持随机访问,所以它的查找效率高其时间复杂度O(1)。

缺点:由于开辟一段连续的空间,所以插入删除会需要对数据进行移动比较麻烦,时间复杂度O(n),另外当空间不足时还需要进行扩容。

list:双向链表

特点:元素在堆中存放,每个元素都是存放在一块内存中,它的内存空间可以是不连续的,通过指针来进行数据的访问。

优点:底层实现是循环双链表,当对大量数据进行插入删除时,其时间复杂度O(1)。

缺点:底层没有连续的空间,只能通过指针来访问,所以查找数据需要遍历其时间复杂度O(n),没有提供[]操作符的重载。

应用场景

vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。

list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。

4.15 C++ 的 vector 和 list中,如果删除末尾的元素,其指针和迭代器如何变化?若删除的是中间的元素呢?

参考回答

1、迭代器和指针之间的区别

迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,重载了指针的一些操作符,–>、++、–等。迭代器封装了指针,是一个”可遍历STL( Standard Template Library)容器内全部或部分元素”的对象,本质是封装了原生指针,是指针概念的一种提升,提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,–等操作。

迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用取值后的值而不能直接输出其自身。

2、vector和list特性

vector特性 动态数组。元素在内存连续存放。随机存取任何元素都在常数时间完成。在尾端增删元素具有较大的性能(大部分情况下是常数时间)。

list特性 双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取。

3、vector增删元素

对于vector而言,删除某个元素以后,该元素后边的每个元素的迭代器都会失效,后边每个元素都往前移动一位,erase返回下一个有效的迭代器。

4、list增删元素

对于list而言,删除某个元素,只有“指向被删除元素”的那个迭代器失效,其它迭代器不受任何影响。

4.16 请你来说一下 map 和 set 有什么区别,分别又是怎么实现的?

参考回答

1、set是一种关联式容器,其特性如下:

(1)set以RBTree作为底层容器

(2)所得元素的只有key没有value,value就是key

(3)不允许出现键值重复

(4)所有的元素都会被自动排序

(5)不能通过迭代器来改变set的值,因为set的值就是键,set的迭代器是const的

2、map和set一样是关联式容器,其特性如下:

(1)map以RBTree作为底层容器

(2)所有元素都是键+值存在

(3)不允许键重复

(4)所有元素是通过键进行自动排序的

(5)map的键是不能修改的,但是其键对应的值是可以修改的

综上所述,map和set底层实现都是红黑树;map和set的区别在于map的值不作为键,键和值是分开的。

4.17 说说 push_back 和 emplace_back 的区别

参考回答

如果要将一个临时变量push到容器的末尾,push_back()需要先构造临时对象,再将这个对象拷贝到容器的末尾,而emplace_back()则直接在容器的末尾构造对象,这样就省去了拷贝的过程。

4.18 STL 中 vector 与 list 具体是怎么实现的?常见操作的时间复杂度是多少?

参考回答

1、vector 一维数组(元素在内存连续存放)

是动态数组,在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放;如果新增大小当前大小时才会重新分配内存。

扩容方式:
a. 倍放开辟三倍的内存

b. 旧的数据开辟到新的内存

c. 释放旧的内存

d. 指向新内存

2、list 双向链表(元素存放在堆中)

元素存放在堆中,每个元素都是放在一块内存中,它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点,使得它的随机存取变得非常没有效率,因此它没有提供[ ]操作符的重载。但是由于链表的特点,它可以很有效的支持任意地方的删除和插入操作。

特点:
a. 随机访问不方便
b. 删除插入操作方便

3、常见时间复杂度

(1)vector插入、查找、删除时间复杂度分别为:O(n)、O(1)、O(n);

(2)list插入、查找、删除时间复杂度分别为:O(1)、O(n)、O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP协议流程详解,抓包分析

目录 TCP概念TCP工作层TCP协议头部解析TCP抓包解析TCP三次握手,数据收发,四次挥手抓包TCP状态迁移 TCP概念 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议&…

MyBatis操作数据库(查询功能)

目录 一、MyBatis的概念 二、配置MyBits环境 三、 MyBatis连接数据库查询操作(示例) 创建MySQL数据库表 配置MyBatis 配置连接数据库和MyBatis xml文件 ​编辑 四、添加业务代码 实体类entity 数据持久层mapper 创建接口类 创建xml文件 服务层…

偏向锁、轻量级锁、重量级锁、自旋锁、自适应自旋锁

1. 偏向锁 偏向锁就是在运行过程中,对象的锁偏向某个线程。即在开启偏向锁机制的情况下,某个线程获得锁,当该线程下次再想要获得锁时,不需要重新申请获得锁(即忽略synchronized关键词),直接就可…

python 房价数据可视化以数据缺失处理、及回归算法

基本信息概述 房价数据为他国地区使用工具为JupyterLab、python3用到的包 绘图包:seaborn、matplotlib数据处理包:numpy、pandas统计计算包:math、scipy回归模型包:make_pipeline、 RobustScaler、ElasticNet,Lasso、KernelRidge…

设计模式(十四):行为型之策略模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

Python使用最新版pyinstaller将项目或程序打包成exe或者mac中的可执行文件

1、pyinstaller的说明: pyinstaller 能够在 Windows、Linux、Mac 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个独立文件方便传递和管理。 PyInstaller 支…

进程管道:父进程和子进程

在接下来的对pipe调用的研究中,我们将学习如何在子进程中运行一个与其父进程完全不同的另外一个程序,而不是仅仅运行一个相同程序。我们用exec调用来完成这一工作。这里的一个难点是,通过exec调用的进程需要知道应该访问哪个文件描述符。在前…

设计模式(十三):行为型之模板方法模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

S200, S1700, S5700交换机忘记密码怎么办(huawei)

目录 交换机忘记密码怎么办?如何修改或清除密码? 简介 一:修改了所有默认密码,还忘记了所有密码 二:忘记了Console口登录密码 方法一:通过STelnet/Telnet登录设备修改Console口密码 方法二&#xff1…

RV1126笔记三十六:PaddleOCR环境搭建一

若该文为原创文章,转载请注明原文出处。 在前面测试过PaddleOCR的文字识别功能,现在自己搭建训练模型并测试。 这篇主要是环境搭建,环境为win10无GPU. 1、创建环境 # 创建paddle环境 conda create -n paddle python=3.8 # 查看环境 conda env list # 切换环境 conda acti…

第三章 模型篇:模型与模型的搭建

写在前面的话 这部分只解释代码,不对线性层(全连接层),卷积层等layer的原理进行解释。 尽量写的比较全了,但是自身水平有限,不太确定是否有遗漏重要的部分。 教程参考: https://pytorch.org/tutorials/ https://githu…

RK3588平台开发系列讲解(以太网篇)SGMII和RGMII接口特性

文章目录 一、MAC 与 PHY的连接二、MAC 与 PHY 在OSI 中位置2.1、网络层2.2、数据链路层2.3、物理层三、RGMII四、SGMII沉淀、分享、成长,让自己和他人都能有所收获!😄 一、MAC 与 PHY的连接 从硬件的角度看,以太网接口电路主要由MAC控制器和物理层PHY芯片两部分组成。 以…

Redis 五大数据类型/结构

Redis 五大数据类型/结构 操作文档 官方文档: https://redis.io/commands 中文文档: http://redisdoc.com/ Redis 数据存储格式 一句话: redis 自身是一个Map,其中所有的数据都是采用key : value 的形式存储 key 是字符串,value 是数据,数…

流媒体接入服务的一般模型

0x00 背景说明 媒体接入服务用来实现媒体资源(resource)的接收和发送,在有限范围内实现不同接入协议的转换。 0x01 一般模型 媒体传输通道的建立步骤通常分为两个阶段: 握手/协商媒体传输 其中,握手/协商操作通常包含: 媒体…

【GD32F303CCT6BlueBill开箱点灯教程】

【GD32F303CCT6BlueBill开箱点灯教程】 1. 搭建环境1.1 官方资料1.2 安装Keil 51.3 安装芯片选型插件pack包 2. 编译2.1 Keil4转换为Keil5工程2.2 选择芯片型号2.3 存储器类型2.4 选择下载器2.5 内存下载设置 3. 烧录3.1 Keil内烧录3.1.1 J-Link烧录3.1.2 ST-Link烧录3.1.3 CMS…

读书笔记:《远见:如何规划职业生涯3大阶段》

《远见:如何规划职业生涯3大阶段》,作者布赖恩. 费瑟斯通豪,豆瓣链接:https://book.douban.com/subject/27609489/ 主旨:描述职业生涯中3个截然不同但相互关联的阶段,教会我们如何不断储备职场燃…

【linux指南--命令大全】

系统的学习linux常用的命令,命令很全所以篇幅很长,可以作为你查阅命令的手册。也欢迎大佬们评论区补充。 文章目录 常见目录介绍配置文件系统操作帮助命令man 帮助help 帮助info 帮助 显示当前的目录名称文件查看建立目录删除空目录复制文件移动文件删除…

Qt下面窗口嵌套,嵌套窗口中包含:QGraphicsView、QGraphicsScene、QGraphicsIte

Qt系列文章目录 文章目录 Qt系列文章目录前言一、嵌套窗口二、注意事项 前言 我们有一个主窗口mainwindow,需要向其中放入新的界面,你可以自己定义里面内容。 Qt的嵌套布局由QDockWidget完成,用Qt Creator拖界面得到的dock布置形式比较固定,…

vmware设置centos客户机和windows宿主机共享文件夹

一、安装内核 kernel-devel 包 yum install gcc yum install kernel-devel-$(uname -r) 注意,如果自己修改过内核版本,需要确保 uname -r 显示的版本和实际使用的内核版本一致。 二、安装 vmware-tools 在vmware上点击菜单:虚拟机->安…

Android kotlin 实现仿京东多个item向左自动排队(横向、动手滑动、没有首尾滑动)功能

文章目录 一、实现效果二、引入依赖三、源码实现1、适配器2、视图实现一、实现效果 二、引入依赖 在app的build.gradle在添加以下代码 1、implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6,这个里面带的适配器,直接调用就即可 BaseRecyclerViewAdapt…