STL和泛型编程

news2024/9/21 16:25:59

STL和泛型编程

  • 一.STL六大部件
    • "前开后闭"区间
  • 二.容器
    • (1)顺序容器
      • 1.array
        • 源码剖析
      • 2.vector
        • 源码剖析
        • vector的迭代器
      • 3.list
        • 源码剖析
          • 迭代器的设计规则
          • 关于重载++操作符
          • 关于重载->和*操作符
      • 4.forward_list
        • 源码剖析
      • 5.deque
        • 源码剖析
        • 底层数据结构
        • 操作实现
        • deque的设计
        • deque的迭代器
        • deque的插入
        • deque模拟连续空间
    • (2)容器适配器
      • 1.stack
      • 2.queue
      • queue和stack源码剖析
    • (3)关联式容器
      • 1.mutiset
      • 2.multimap
    • (4)哈希结构
      • 1.unordered_multiset
      • 2.unordered_multimap
    • (5)元素不可以重复
      • 1.set
      • 2.map
      • 3.unordered_set
      • 4.unordered_map
  • 三.OOP VS GP
  • 四.分配器
  • 五. 红黑树
    • 源码剖析
    • 测试
    • 以红黑树为底层的容器
      • set、multiset
        • 源码剖析![image-20240321190148264](https://img-blog.csdnimg.cn/img_convert/6e5f5ae6ce382c7873fef6af04324458.png)
      • map、multimap
        • 源码剖析
        • map独有的[]
  • 六. 哈希表
    • 源码剖析
    • 测试
    • unordered容器
  • 七. 算法
    • 迭代器的分类
      • 验证容器的迭代器种类
      • 迭代器分类对算法的影响
    • 算法源代码剖析
      • 1.accumulate
      • 2.for_each
      • 3.replace,replace_if,replace_copy
      • 4.count,count_if
      • 5.find,find_if
      • 6.sort
      • 7.binary_search
  • 八. 仿函数(函数对象)
    • STL仿函数编写条件
  • 九. 适配器
    • 1.binder2nd
    • 2.not1
    • 3.bind
  • 八. 仿函数(函数对象)
    • STL仿函数编写条件
  • 九. 适配器
    • 1.binder2nd
    • 2.not1
    • 3.bind

以STL为目标探讨泛型编程。

一.STL六大部件

image-20240309114843162

算法通过迭代器来处理容器中的数据。

容器使用分配器来管理它们的内存。分配器将内存分配和释放的实现细节封装起来,使得容器可以在运行时根据需要动态地分配内存。

适配器允许在现有的容器或迭代器之上实现不同的行为或提供新的接口,从而更加方便地操作数据。

仿函数通常用于算法、容器和其他组件中,以提供各种功能和灵活性。它们可以作为算法的参数传递,也可以用于自定义容器的排序、查找和比较操作等。使用仿函数可以在编译时将函数调用行为封装到对象中,从而提供更灵活和通用的功能。算法通常通过仿函数来完成比较、排序和其他操作,这使得算法可以适用于各种数据类型和需求。

image-20240309150135553

image-20240309150152283

"前开后闭"区间

所有容器满足:"前开后闭"区间

image-20240311105245779

二.容器

image-20240311110352371

  • array无法扩充。

  • vector尾可以扩充。

  • deque头尾都可以扩充。

set和map一般是红黑树实现,unordered_set和unordered_map一般是hash表实现(分离链接法)。

(1)顺序容器

1.array

image-20240311160445499

image-20240311160454539

image-20240311160511440

源码剖析

image-20240319191923470

2.vector

image-20240311162255981

image-20240311170616221

image-20240311170632347

image-20240311170648403

image-20240311170707731

源码剖析

image-20240312190104257

几乎所有vector的实现都是当vector需要扩充的时候,进行两倍成长。会造成大量的拷贝构造和析构。

image-20240312190748654image-20240312190757806

vector的迭代器

image-20240312191222285

3.list

image-20240311191644564

image-20240311191702102

image-20240311191924433

源码剖析

image-20240312165002089

list本身就是一个指针(link_type),link_type是一个指针(list_node*)指向了一个_list_node结构体。

list是非连续空间,因此iterator不能是指针(只有vector和array的iterator是指针,其余都是结构体)。

image-20240312171959909

迭代器的设计规则

迭代器必须定义五种类型,以便于能回答算法的问题。

image-20240312180256145

1.迭代器的类型。关于前向、双向、随机等。

2.两个迭代器间的距离。

3.迭代器指向的元素的类型。

image-20240312180450120

  1. iterator_traits<Iterator>::value_type:迭代器指向的元素的类型。
  2. iterator_traits<Iterator>::difference_type:两个迭代器之间的差值类型。这通常用于表示两个迭代器之间的距离。
  3. iterator_traits<Iterator>::iterator_category:迭代器的类型分类,如 std::input_iterator_tagstd::forward_iterator_tagstd::bidirectional_iterator_tagstd::random_access_iterator_tag。这用于区分迭代器的不同能力。
  4. iterator_traits<Iterator>::pointeriterator_traits<Iterator>::reference:这两个类型通常分别定义为 value_type*value_type&,但某些迭代器类型可能会提供特殊的指针或引用类型。

image-20240312181455515

为了应付迭代器有指针的形式,需要一个中间层traits。traits中使用了模板的偏特化,区分当参数是指针或类。

image-20240312182143408

关于重载++操作符

image-20240312172153859

重载后置++

  • 先调用拷贝构造函数将当前的对象复制给tmp
  • 然后对当前对象进行前置++操作
  • 最后返回tmp

关于返回值

  • 因为标准库中后置++不可以连做两次,因此这里值传递返回。前置++可以连做两次,返回引用。
关于重载->和*操作符

image-20240312174033534

image-20240312174422064

list的指针类型修改为指向自己的,相比于指向void更精确。

4.forward_list

只提供push_front插入,且不提供size()。

image-20240311192615727

image-20240311192730020

image-20240311192738244

源码剖析

image-20240319192235418

5.deque

image-20240311193711133

image-20240311193717925

image-20240311193723184

源码剖析

image-20240319192606545

在C++标准库中,deque(双端队列)的实现是优化了从序列两端插入和删除操作的容器。与vector相比,它不保证所有元素都在连续的内存地址中,但仍然能够提供对任何元素的直接(随机访问)访问。这是通过一个复杂的内部数据结构实现的,旨在兼顾两端操作的高效性和随机访问的能力。

底层数据结构

deque的实现通常采用一种“分块数组”(或称为“段数组”)的策略。具体来说:

  1. 多个固定大小的数组块deque由多个数组块组成,每个块能够存储固定数量的元素。这些数组块的大小通常是实现定义的,可以根据元素的类型和容器的大小动态调整以优化性能。
  2. 映射器(Map)deque内部使用一个中心数据结构(通常是一个数组或动态数组),来维护对这些块的引用(指针或索引)。这个中心结构被称为映射器,它按序记录了所有块的位置,使得可以快速定位到任何一个元素所在的块。
操作实现
  • 随机访问:通过映射器,deque可以计算出任何元素的位置,即首先定位到正确的块,然后在该块内进行索引。这使得随机访问的时间复杂度为O(1),与vector相同。
  • 在两端插入和删除:由于deque的设计,它可以在头部或尾部添加或移除元素而无需移动其他元素。如果在一端的块已满且需要添加更多元素时,deque将分配一个新的块并更新映射器。这种操作通常比vector的动态扩容(涉及复制现有元素到新的内存地址)更高效。
  • 动态扩容:当deque增长到超出当前映射器容量时,它需要一个更大的映射器来存储更多的块引用。此时,deque将分配一个新的更大的映射器,复制旧映射器中的引用到新映射器中,然后释放旧映射器。
deque的设计

image-20240320111058160

deque的迭代器

image-20240320112755459

deque的插入

image-20240320113118465

image-20240320113306125

deque模拟连续空间

image-20240320114827113

image-20240320114834784

image-20240320114842030

image-20240320114849775

image-20240320114857650

(2)容器适配器

不提供iterator,因为一定是一端进,一端出。提供iterator会导致可以从任意地方进出容器,破坏一致性。

1.stack

image-20240311194442422

image-20240311194454801

2.queue

image-20240311194749072

image-20240311194707104

image-20240311194737285

queue和stack源码剖析

image-20240320115428548

image-20240320115439820

image-20240320115458214

image-20240320115507497

image-20240320115520364

image-20240320193044530

image-20240320193211014

(3)关联式容器

1.mutiset

image-20240312093341996

key就是value,value就是key。

image-20240312093205615

image-20240312093232533

image-20240312093251835

2.multimap

image-20240312093403401

image-20240312094237031

image-20240312094246872

image-20240312094324956

(4)哈希结构

1.unordered_multiset

image-20240312100501750

image-20240312100518642

image-20240312100529018

image-20240312100555255

image-20240312100603352

2.unordered_multimap

image-20240312104357521

image-20240312104412163

(5)元素不可以重复

1.set

image-20240312104811340

image-20240312104630735

image-20240312104640135

2.map

image-20240312104900071

image-20240312104914607

3.unordered_set

image-20240312105227341

image-20240312105237556

image-20240312105258366

image-20240312105314253

4.unordered_map

image-20240312105439175

image-20240312105450351

三.OOP VS GP

image-20240312114104629

因为在模板sort的内部,对迭代器进行了跳跃式操作,只有随机访问迭代器可以这么操作。

而list的迭代器是双向迭代器,只支持++和–。

image-20240312114345116

优点

image-20240312114418618

四.分配器

C++标准库在很多地方采用特殊对象处理内存的分配和规划,这样的对象称为分配器(allocator)。allocator表现出一种特殊内存模型,被当成一种用来把内存需求转换为内存低级调用的抽象层。

C++标准库中链表模板的完整参数定义是:

template<class T, class Alloc=allocator<T>> 
class list;

当省略最后的模板参数时,容器将采用标准中预定义的分配器std::allocator<T>。该分配器调用new/delete操作符申请和释放内存,足以满足大多数需求。而当需要定制容器中的内存操作时,可以按照标准中的分配器规范,将内存操作封装在一个新的分配器类模板中并传入容器,比如:

std::list<my_data, my_allocator<my_data>> custom_list;

标准库中可以接受分配器的容器模板包括:

  • 序列型容器vectordequelistforward_list
  • 集合容器setmultisetmapmultimap
  • 散列表容器unordered_setunordered_multisetunordered_mapunordered_multimap

具体来说:

  • 分配器是一个类(class Alloc),而不是函数或者模板

  • 分配器是和具体类型相关的,因为默认构造器std::allocator<T>随容器保存类型的不同而不同。

  • 可以想象,分配器的行为应该类似new/delete操作符,而不是malloc/free(前者需要知道空间所存放的类型而后者只关心空间的大小)。

  • 分配器内至少需要有两个成员函数分别响应容器的申请以及释放内存的请求。

  • 分配器的首要作用是申请与释放内存。通过两个成员函数allocatedeallocate来实现。无论其定义如何,两成员函数必须能够实现如下用法:

a.allocate(n); // 申请能保存n个value_type的数据, 如果申请空间失败,抛出异常std::bad_alloc
a.allocate(n, p);
a.deallocate(p, n); //要释放的空间指针p和空间大小n

image-20240312160725237

image-20240312161632458

五. 红黑树

image-20240320193335534

源码剖析

image-20240320201248287

image-20240320201255803

测试

image-20240320203128720

以红黑树为底层的容器

set、multiset

image-20240321185641182

源码剖析image-20240321190148264

image-20240321190949872

map、multimap

image-20240321192042240

源码剖析

image-20240321192202509

map独有的[]

image-20240321192821636

六. 哈希表

image-20240321194553220

空间足够的时候,假如有2的32次方元素变化,可以用4G的空间来存储。但是这是不可能的。

空间不够的时候,假如有2的32次方元素变化,因此需要取模将元素放入对应的格子中。但是会发生碰撞,因此用链表将碰撞的元素串起来。

如果某个格子串起来的元素的个数大于格子的总数,说明格子空间不够了,因此重新划分格子数目。

image-20240321194958687

源码剖析

image-20240321200157330

测试

image-20240321212229821

image-20240321212240369

对数值来说,传进去的数值就是编号。

image-20240321212618478

对字符来说,选一种方法能尽可能打乱。

image-20240321212945491

unordered容器

image-20240321214251699

七. 算法

image-20240322095645298

  • 算法的所有操作都依赖迭代器。

迭代器的分类

image-20240322100602851

随机访问迭代器:vector、array、deque

双向访问迭代器:list、set、multisest、map、multimap

单向访问迭代器:forward_list

验证容器的迭代器种类

image-20240322105912353

image-20240322105934212

image-20240322105947873

迭代器分类对算法的影响

image-20240322112212363

distance算法针对不同的迭代器使用不同的方法计算距离。

image-20240322112408725

image-20240322112444985

返回类型就是difference_type。

image-20240322112611746

image-20240322113134365

image-20240322114123090

image-20240322114214556

算法源代码剖析

1.accumulate

image-20240322133729972

image-20240322152422653

image-20240322152435592

2.for_each

image-20240322152617578

image-20240322153131374

3.replace,replace_if,replace_copy

image-20240322152854172

replace 函数用于将容器中的某个值替换为另一个值。

函数原型

template<class ForwardIt, class T, class U>  
void replace(ForwardIt first, ForwardIt last, const T& old_value, const U& new_value);
  • first, last:指定要搜索的容器范围。
  • old_value:要被替换的值。
  • new_value:替换后的新值。

示例

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
int main() {  
    std::vector<int> vec = {1, 2, 3, 2, 4, 2, 5};  
    std::replace(vec.begin(), vec.end(), 2, 9);  
    for (int x : vec) {  
        std::cout << x << ' ';  
    }  
    // 输出:1 9 3 9 4 9 5  
    return 0;  
}

在这个例子中,我们将 vec 中所有的 2 替换为 9

replace_if 函数用于根据谓词(即一个返回布尔值的函数或函数对象)的条件来替换容器中的元素。

函数原型

template<class ForwardIt, class UnaryPredicate, class T>  
void replace_if(ForwardIt first, ForwardIt last, UnaryPredicate p, const T& new_value);
  • first, last:指定要搜索的容器范围。
  • p:一个一元谓词,用于测试每个元素是否应被替换。
  • new_value:替换后的新值。

示例

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
bool is_even(int n) {  
    return n % 2 == 0;  
}  
  
int main() {  
    std::vector<int> vec = {1, 2, 3, 4, 5, 6};  
    std::replace_if(vec.begin(), vec.end(), is_even, 0);  
    for (int x : vec) {  
        std::cout << x << ' ';  
    }  
    // 输出:1 0 3 0 5 0  
    return 0;  
}

在这个例子中,我们使用 is_even 谓词来检查 vec 中的每个元素是否为偶数,并将所有偶数替换为 0

replace_copy 函数与 replace 类似,但它不会修改原始容器,而是将替换后的结果复制到另一个容器中。

函数原型

template<class InputIt, class OutputIt, class T, class U>  
OutputIt replace_copy(InputIt first, InputIt last, OutputIt d_first, const T& old_value, const U& new_value);
  • first, last:指定要搜索的输入容器范围。
  • d_first:指向输出容器的开始迭代器。
  • old_value:要被替换的值。
  • new_value:替换后的新值。

示例

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
int main() {  
    std::vector<int> vec = {1, 2, 3, 2, 4, 2, 5};  
    std::vector<int> result;  
    result.resize(vec.size());  // 预先分配足够的空间  
    std::replace_copy(vec.begin(), vec.end(), result.begin(), 2, 9);  
    for (int x : result) {  
        std::cout << x << ' ';  
    }  
    // 输出:1 9 3 9 4 9 5  
    // 注意:原始 vec 容器没有被修改  
    return 0;  
}

在这个例子中,我们将 vec 中所有的元素复制到result容器中,如果遇到值为2的元素,将其改为9复制到result中。

4.count,count_if

image-20240322154305877

count 函数用于统计容器中等于某个特定值的元素数量。

函数原型

template<class InputIt, class T>  
size_t count(InputIt first, InputIt last, const T& value);
  • first, last:指定要搜索的容器范围。
  • value:要搜索的值。

示例

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
int main() {  
    std::vector<int> vec = {1, 2, 3, 2, 4, 2, 5};  
    size_t count_of_two = std::count(vec.begin(), vec.end(), 2);  
    std::cout << "Number of 2 in vec: " << count_of_two << std::endl;  
    // 输出:Number of 2 in vec: 3  
    return 0;  
}

count_if 函数用于统计容器中满足某个谓词(即一个返回布尔值的函数或函数对象)的元素数量。

函数原型

template<class InputIt, class UnaryPredicate>  
size_t count_if(InputIt first, InputIt last, UnaryPredicate p);
  • first, last:指定要搜索的容器范围。
  • p:一个一元谓词,用于测试每个元素是否应被计入统计。

示例

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
bool is_even(int n) {  
    return n % 2 == 0;  
}  
  
int main() {  
    std::vector<int> vec = {1, 2, 3, 4, 5, 6};  
    size_t count_of_evens = std::count_if(vec.begin(), vec.end(), is_even);  
    std::cout << "Number of even numbers in vec: " << count_of_evens << std::endl;  
    // 输出:Number of even numbers in vec: 3  
    return 0;  
}

在这个例子中,我们定义了一个 is_even 谓词来检查一个整数是否为偶数,并使用 count_if 统计 vec 中偶数的数量,结果是 3

5.find,find_if

image-20240322154849145

6.sort

image-20240322154925491

image-20240325083954007

image-20240325084047277

image-20240325084359374

7.binary_search

image-20240325085245238

八. 仿函数(函数对象)

image-20240325090231071

image-20240325091559902

image-20240325091639926

STL仿函数编写条件

image-20240325091845074

unary_function:一个参数

binary_function:两个参数

九. 适配器

image-20240325100027715

image-20240325100901342

1.binder2nd

image-20240325100928123

注意区分小括号是直接调用函数还是创建函数对象。

2.not1

image-20240325132454414

3.bind

image-20240325132504909

image-20240325132519892

image-20240325140629007

image-20240325140705588

image-20240325140719303

7411967)]

八. 仿函数(函数对象)

[外链图片转存中…(img-FKy1J6zp-1711347411967)]

[外链图片转存中…(img-K8lnpskn-1711347411967)]

[外链图片转存中…(img-4fNkLvv0-1711347411967)]

STL仿函数编写条件

[外链图片转存中…(img-LQs5p3Y0-1711347411967)]

unary_function:一个参数

binary_function:两个参数

九. 适配器

[外链图片转存中…(img-ssSnydJm-1711347411968)]

[外链图片转存中…(img-Wan0qRXc-1711347411968)]

1.binder2nd

[外链图片转存中…(img-Zzkjq2ht-1711347411968)]

注意区分小括号是直接调用函数还是创建函数对象。

2.not1

[外链图片转存中…(img-eVhrrKOu-1711347411968)]

3.bind

[外链图片转存中…(img-XHB9sF1W-1711347411968)]

[外链图片转存中…(img-hDiOBKs8-1711347411968)]

[外链图片转存中…(img-8kZRm5Ds-1711347411968)]

[外链图片转存中…(img-PgOUiWZA-1711347411968)]

[外链图片转存中…(img-CM2boWpx-1711347411968)]

image-20240325140730809

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

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

相关文章

力扣面试150 Pow(x, n) 快速幂 负指数

Problem: 50. Pow(x, n) 解题方法 &#x1f468;‍&#x1f3eb; 参考题解 复杂度 时间复杂度: O ( l o g 2 n ) O(log_{2}n) O(log2​n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public double myPow(double x, int n){if (x 0.0f)return 0.0d;long b…

centos7 装 docker-ce

安装必要的系统工具&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 命令会以超级用户的身份安装三个软件包&#xff1a;yum-utils&#xff0c;device-mapper-persistent-…

2024.3.2-玄子Share-Mybatis 八股文面试题(共计:48 道 9000 字)

2024.3.2-玄子Share-Mybatis 八股文面试题&#xff08;共计&#xff1a;48 道 9000 字&#xff09; 前言&#xff1a; 本文部分面试题来源于网络仅供学习使用&#xff0c;请支持原作部分面试题有修改润色&#xff0c;部分面试题由我&#xff08;玄子&#xff09;自写面试题根据…

牛客NC12 重建二叉树【中等 dfs Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6 思路 先序遍历第一个值就是根节点&#xff0c;根据这个值可以在中序中划分左右子树&#xff0c; 我们这里已经将一个数划分成两颗子树&#xff0c;那么在递归的使用刚刚的分析…

大模型时代的向量数据库:原理解析和应用案例

大家好&#xff0c;在人工智能领域&#xff0c;数据处理和加工的需求愈发增加。随着人们深入探索AI高级的应用&#xff0c;如图像识别、语音搜索和推荐引擎等&#xff0c;数据的复杂性也在不断地增加。此时传统的数据库存储方式已不能完全满足需求&#xff0c;向量数据库应运而…

大模型知识点汇总——分布式训练

PS&#xff1a;本篇只在宏观上介绍相关概念和技术&#xff0c;不做数学推导和过于细节介绍&#xff0c;旨在快速有一个宏观认知&#xff0c;不拘泥在细节上&#xff0c;导致很混乱。 涉及技术名词 分布式框架等涉及的技术名词很多&#xff0c;很容易让人眼花缭乱&#xff0c;…

vdat文件分段了怎么合并成MP4?批量导入一键合并!

一些监控摄像头、视频录像软件或其他专用设备可能会生成vdat文件作为其录制的视频数据文件。一些浏览器比如夸克下载的视频也会出现vdat格式&#xff0c;因为流媒体播放采用的是分段加载&#xff0c;在网络不好的时候&#xff0c;重新加载对文件整体性损坏比较小&#xff0c;所…

springboot 中Aop注解切面实现收集日志与统计耗时2

一 Aop注解实现切面 1.1 工程结构 Before&#xff1a;前置通知, 在方法执行之前执行 Aroud&#xff1a;环绕通知, 围绕着方法执行 After&#xff1a;后置通知, 在方法执行之后执行 AfterReturning&#xff1a;返回通知, 在方法返回结果之后执行 AfterThrowing&#xff1a;异…

su怎么做展厅模型---模大狮模型网

要在SketchUp中创建展厅模型&#xff0c;你可以按照以下基本步骤进行&#xff1a; 绘制基本结构&#xff1a; 使用SketchUp的绘图工具(线条、矩形、圆形等)来创建展厅的基本结构&#xff0c;包括墙壁、地板和天花板等。确保按照实际尺寸和比例进行绘制。 添加家具和展品&…

vue学习日记18:data是一个函数组件通信

一、data是一个函数 1.概念 2.代码 相互独立互不影响 二、组件通信 1.概念 &#xff08;1&#xff09;什么是组件通信 &#xff08;2&#xff09;不同组件关系和组件通信方案分类 &#xff08;3&#xff09;组件通信解决方案 &#xff08;4&#xff09;父子通信流程图 -…

CrossOver虚拟机软件2024中文版最新功能介绍

CrossOver是一款由CodeWeavers公司开发的&#xff0c;运行在Mac和Linux操作系统下&#xff0c;能够模拟Windows系统应用运行环境的软件。它不需要用户单独安装Windows操作系统&#xff0c;就能让Windows平台上的应用程序在Mac和Linux上顺畅运行。CrossOver在技术上使用了Wine&a…

鸿蒙开发之了解ArkTS

鸿蒙开发者官网 &#xff1a; https://developer.huawei.com/consumer/cn/ 开发鸿蒙要用的软件是 DevEco Studio ArkTS建立在JS和TS的基础之上&#xff0c;扩展了声明式UI开发范式和状态管理&#xff0c;提供更简洁和自然的开发方式。 ArkTS引入了渲染引擎的增强&#xff0c…

第 1 章.提示词:开启AI智慧之门的钥匙

什么是提示词&#xff1f; 提示词&#xff0c;是引导语言模型的指令&#xff0c;让用户能够驾驭模型的输出&#xff0c;确保生成的文本符合需求。 ChatGPT&#xff0c;这位文字界的艺术大师&#xff0c;以transformer架构为基石&#xff0c;能轻松驾驭海量数据&#xff0c;编织…

office办公技能|word中的常见使用问题解决方案2.0

一、设置多级列表将表注从0开始&#xff0c;设置为从1开始 问题描述&#xff1a;word中插入题注&#xff0c;出来的是表0-1&#xff0c;不是1-1&#xff0c;怎么办&#xff1f; 写论文时&#xff0c;虽然我设置了“第一章”为一级标题&#xff0c;但是这三个字并不是自动插入的…

【Docker】Docker安全与最佳实践:保护你的容器化应用程序

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

GEE显示研究区sentinel-2每年可用影像

第一次使用GEE&#xff0c;用了别人的代码&#xff0c;想查看每年影像可用数量&#xff0c;但是老是报错&#xff0c;说是null geometry&#xff0c;之前我是用GAMMA软件导出的kml文件&#xff0c;后面在arcgis自己勾画了sho文件&#xff0c;线类型&#xff0c;然后我就在想会不…

AI 工具到底要怎么用,老板才满意?

AI 大模型&#xff08;GPT-3.5&#xff09;从问世到现在广泛应用&#xff0c;已经一年多时间&#xff0c;去年 8 月&#xff0c;我们曾经探讨过“有了 AI 大模型&#xff0c;人工客服就没用了&#xff1f;”这个话题&#xff0c;彼时百模大战如火如荼&#xff0c;AI 创业公司风…

Vant Weapp小程序 van-uploader 文件上传点击无反应,删除无反应

Vant Weapp 1.0 版本开始支持van-uploader组件&#xff0c;请先确认好版本号和引用路径正确&#xff01;&#xff01; <van-uploader file-list"{{ fileList }}" deletable"{{ true }}" />1. 上传无反应 微信小程序用了van-uploader&#xff0c;但是…

kubernetes-k9s一个基于Linux 终端的集群管理工具

效果预览 下载 github 版本 此文档使用的版本是 v0.32.4&#xff0c;下载地址&#xff1a; https://github.com/derailed/k9s/releases/download/v0.32.4/k9s_linux_amd64.rpm 安装 rpm -ivh k9s_linux_amd64.rpm使用 启动 终端直接执行命令 k9s k9s基本操作 1 选择目…

进程状态究竟是什么?在Linux操作系统中具体存在哪些进程状态?

进程状态究竟是什么&#xff1f;在Linux操作系统中具体存在哪些进程状态&#xff1f; 前言一、操作系统中的进程状态1.1 运行状态1.2 阻塞状态和唤醒1.3 挂起状态 二、Linux操作系统中具体进程状态Linux中的进程状态种类2.1 R运行状态&#xff08;running&#xff09;2.2 前台进…