当前位置: 首页 > news >正文

【C++杂货铺】C++11特性总结:列表初始化 | 声明 | STL的升级

在这里插入图片描述

文章目录

  • 一、C++11简介
  • 二、统一的列表初始化
    • 2.1 { } 初始化
    • 2.2 列表初始化在内置类型上的应用
    • 2.3 列表初始化在内置类型上的应用
    • 2.4 initializer_list
      • 2.4.1 {1, 2, 3} 的类型
      • 2.4.2 initializer_list 使用场景
      • 2.4.3 模拟实现的 vector 中的 { } 初始化和赋值
  • 三、声明
    • 3.1 auto
      • 3.1.1 auto使用细则
      • 3.1.2 不能使用auto的场景
    • 3.2 decltype
    • 3.3 nullptr
  • 四、STL中的一些变化
  • 五、结语

一、C++11简介

在 2003 年 C++ 标准委员会曾经提交了一份技术勘误表(简称 TC1),使得 C++03 这个名字已经取代了 C++98,成为 C++11 之前的最新 C++ 标准名称,不过由于 C++03(TC1)主要是对 C++98 标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为 C++98/03 标准。从 C++0x 到 C++11,C++ 标准十年磨一剑,第二个真正意义上的标准姗姗来迟。相比于 C++98/03,C++11 则带来了数量客观的变化,其中包含了约 140 个新特性,以及对 C++03 标准中约 600 个缺陷的修正,这使得 C++11 更像是从 C++98/03 中孕育出的一种新语言。相比较而言,C++11 能更好的用于系统开发和库开发、语法更加泛化和简单化、更加安全和稳定,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用的比较多,所以我们要作为一个重点去学习。C++11 增加的语法特性篇幅非常多,没办法一一为大家讲解,所以我会挑一些实际中比较实用的语法分享给大家。

小故事
1998 年是 C++ 标准委员会成立的第一年,本来计划以后每五年更新一次标准,C++ 国际标准委员会在研究 C++03 的下一个版本的时候,一开始计划是 2007 年发布,所以最初这个标准叫 C++07。但是到 2006 年的时候,官方觉得 2007 年肯定完不成 C++07,而且官方觉得 2008 年可能也完不成。最后干脆叫 C++0x。x 的意思是不知道到底能在 07 还是 08 还是 09 年完成。结果 2010 年的时候也没完成,最后在 2011 年终于完成了新的 C++ 标准,所以最终定名为 C++11。

二、统一的列表初始化

2.1 { } 初始化

在 C++98 中,标准允许使用花括号 { } 对数组或者结构体元素进行统一的列表初始化。如下:

struct Point
{int _x;int _y;
};int main()
{int arrya1[] = { 1, 2, 3, 4 };//列表初始化,初始化数组int array2[5] = { 0 };//列表初始化,初始化数组Point p = { 1, 2 };//列表初始化,初始化结构体元素Point array3[] = { {1, 2}, {3, 4}, {5, 6} };//列表初始化,初始化结构体数组return 0;
}

2.2 列表初始化在内置类型上的应用

C++11 扩大了用大括号括起来的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可以添加等号(=),也可以不添加。(建议在使用的过程中别去掉等号)

struct Point
{int _x;int _y;
};int main()
{int arrya1[] = { 1, 2, 3, 4 };int array2[5] = { 0 };Point p = { 1, 2 };Point array3[] = { {1, 2}, {3, 4}, {5, 6} };//C++11 中列表初始化应用在内置类型上int x1 = 10;int x2 = { 20 };int x3{ 30 };//不带等号//C++11 中列表初始化也可以适用于 new 表达式中int* p1 = new int[5]{100};return 0;
}

2.3 列表初始化在内置类型上的应用

创建对象时也可以使用列表初始化的方式来调用构造函数初始化。

class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout << "Date(int year, int month, int day)" << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2022, 1, 1); // old style// C++11支持的列表初始化,这里会调用构造函数初始化Date d2{ 2022, 1, 2 };Date d3 = { 2022, 1, 3 };//这里本质上是 C++11 实现了多参数的构造函数支持隐式类型转换return 0;
}

小Tips:如果在 Date 类的构造函数前面加上 explicit 关键词进行修饰,那么 Date d3 = { 2022, 1, 3 }; 就会出现编译报错,因为这条语句本质上是因为 C++11 中实现了多参数的构造函数支持隐式类型转换。Date d2{ 2022, 1, 2 }; 没事,任然可以正常运行。

void Test()
{//Date& d1 = { 2003, 10, 18 };//(错误)隐式类型转换的过程中会产生临时的中间变量,这个中间变量具有常性const Date& d1 = { 2003, 10, 18 };//(正确)
}

2.4 initializer_list

2.4.1 {1, 2, 3} 的类型

int main()
{auto il = { 1, 2, 3 };cout << typeid(il).name() << endl;return 0;
}

在这里插入图片描述

2.4.2 initializer_list 使用场景

initializer_list 一般是作为构造函数的参数,C++11 对 STL 中的不少容器就增加了 initializer_list 作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为 operator= 的参数,这样就可以用大括号赋值。

int main()
{vector<int> v = { 1,2,3,4 };//调用vector中形参为 initializer_list 的构造函数list<int> lt = { 1,2 };//调用list中形参为 initializer_list 的构造函数// 这里{"sort", "排序"}会先初始化构造一个pair对象map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };// 使用大括号对容器赋值v = { 10, 20, 30 };//调用vector中形参为 initializer_list 的赋值运算符重载函数Date d1 = { 2003, 4, 5 };//这里是直接调用两个参数的构造函数 --- 隐式类型转换return 0;
}

小Tips:需要注意,上面代码中创建 Date 类型的对象 d1,本质上是隐式类型的转换。vector、list、map 都是容器,它们存储的数据个数可多可少,并不确定,所以它们都提供了形参为 initializer_list 的构造函数,这样就方便我们将任意数量的元素存到容器中。而 Date 作为一个日期类对象,它的三个成员变量是固定的,所以不需要提供形参为 initializer_list 的构造函数。因此上面创建 d1 本质上是隐式类型转换。同理,dict 是一个 map 类型的容器,它里面存的每个元素都是一个 pair,因此先要构建一个 pair 类型的对象,{"sort", "排序"} 本质上也是通过多参数构造函数的隐式类型转换去构造一个 pair 对象。总结,在创建 dict 对象的时候,先通过隐式类型转换去构建一个 pair 类型的对象,再通过列表初始化去穿件 map 类型的对象 dict。

2.4.3 模拟实现的 vector 中的 { } 初始化和赋值

//用列表初始化的构造函数
vector(initializer_list<T> lt)
{reserve(lt.size());//一次性开好,避免push_back中多次调用,提高斜率for (auto e : lt){push_back(e);}
}
//用列表进行赋值
vector<T>& operator=(initializer_list<T> il)
{vector<T> tmp(il);swap(tmp);return *this;
}

三、声明

C++11 提供了多种简化声明的方式,尤其是在使用模板时。

3.1 auto

在 C++98 中 auto 是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以 auto 就没什么价值了。C++11 中废弃 auto 原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。

int main()
{int i = 10;auto p = &i;auto pf = strcpy;cout << typeid(p).name() << endl;cout << typeid(pf).name() << endl;map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };//map<string, string>::iterator it = dict.begin();auto it = dict.begin();return 0;
}

在这里插入图片描述

3.1.1 auto使用细则

auto与指针和引用结合起来使用:用auto声明指针类型时,用auto和aauto*没有任何区别,但是auto声明引用类型时,必须要加&,如下,如果c不加&的话,就是x的一份拷贝。

int main()
{int x = 10;auto a = &x;//根据右边推出,a是一个指针类型auto* b = &x;//右边必须是一个地址,因为前面加了*auto& c = x;//引用必须要加&
}

在同一行定义多个变量:当在同一行声明多个变量的时候,这些变量必须是相同的类型,否则编译器会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

int main()
{auto a = 10, b = 30;auto c = 60, d = 1.1;//该行编译失败,c和d的初始化类型不同
}

在这里插入图片描述

3.1.2 不能使用auto的场景

  • auto不能作为函数的参数
//错误,编译器无法对x的实际类型进行推导
void Text(auto x)
{}
  • ·auto不能直接用来声明数组
void Text()
{//auto arr[] = { 1, 2, 3 };//错误写法,请勿模仿int arr[] = {1, 2, 3}//这才是正确写法
}

小Tips:auto在实际中常被用在:基于范围的for循环中、还有lambda表达式中、其次就是一些非常非常长的类型,也会用auto进行替换。

3.2 decltype

关键字 decltype 将变量的类型声明为表达式指定的类型。

// decltype的一些使用使用场景
template<class T1, class T2>
void F(T1 t1, T2 t2)
{decltype(t1 * t2) ret;cout << typeid(ret).name() << endl;
}
int main()
{const int x = 1;double y = 2.2;decltype(x * y) ret; // ret的类型是doubledecltype(&x) p;      // p的类型是int*cout << typeid(ret).name() << endl;cout << typeid(p).name() << endl;F(1, 'a');map<decltype(x), decltype(&x)> mp;//做模板实参return 0;
}

在这里插入图片描述
小Tips:decltype(x) 与 typeid(x).name() 的区别在于,前者获取到 x 的类型后,可以在后面紧接着去定义一个和 x 类型相同的变量,或者将该类型作为模板的实参。而后者只能获取到 x 的类型,将其以字符串的形式打印出来,不能在其后面接着定义变量。

3.3 nullptr

由于 C++ 中 NULL 被定义成字面量0,这样就可能会带来一些问题,因为0既能表示指针常量,又能表示整型常量。所以出于清晰和安全的角度考虑,C++11 中新增了 nullptr,用于表示空指针。

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

四、STL中的一些变化

C++11 新增了一些容器。用橘色圈起来的就是 C++11 中的一些几个新容器,但是实际最有用的是 unordered_set 和 unordered_map。这个在【C++杂货铺】一文带你走进哈希 中给大家介绍过了,其他的容器大家了解一下即可。
在这里插入图片描述
array:是一个静态数组。即它可以存储多少数据是在定义该 arrary 对象的时候就确定好的,它和我们自己定义的数组区别在于,他对越界的检查十分严格。

int main()
{int ar1[10];array<int, 10> ar2;ar1[15] = 1;return 0;
}

在这里插入图片描述
可以看出,对于我们自己定义的数组,越界访问程序可能不会报错,任然可以正常退出。因为 ar1[15] = 1 本质上是对指针的解引用,即 *(ar1 + 15) = 1

int main()
{int ar1[10];array<int, 10> ar2;ar2[15] = 1;return 0;
}

在这里插入图片描述
对 array 对象越界访问,最终程序崩溃了。因为这里 ar2[15] = 1 本质上是去调用 operator[ ] 这个函数,该函数内部进行了检查,所以一旦越界访问,程序就会崩溃。总之,array 这个容器提供出来多少显得有一点鸡肋,更多情况下大家还是更喜欢用 vector。

forward_list:是一个单链表,只支持单向迭代器,并且只支持头插和头删。尾删因为要找前一个结点,效率会比较低,它的 insert 也是在当前结点的后面进行插入。

容器中的一些新方法:再仔细的去看可以发现基本每个容器中都增加了一些 C++11 的方法,但是其实还有很多都是用的比较少的。

  • 比如,提供了 cbegin 和 cend 方法返回 const 迭代器等等,但是实际意义并不大,因为 begin 和 end 也是可以返回 const 迭代器的,这些都属于锦上添花的操作。

  • 其次,所有的容器都新增了{}列表初始化的构造函数,这一点用途还是蛮大的。

  • 所有的容器都提供了 emplace 系列的接口,这个接口可以提高插入的性能。这里还涉及两个其他的知识点:右值引用和模板的可变参数,将在后面的文章中为大家讲解。其次,C++11 中对 push_back 接口进行了升级,新增了形参为右值引用的版本,这也使得插入的性能得以提升。

  • 并且 C++11 中还新增了移动构造和移动赋值,这让深拷贝的性能提升了 90%。

五、结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,春人的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是春人前进的动力!

在这里插入图片描述

相关文章:

【C++杂货铺】C++11特性总结:列表初始化 | 声明 | STL的升级

文章目录 一、C11简介二、统一的列表初始化2.1 { } 初始化2.2 列表初始化在内置类型上的应用2.3 列表初始化在内置类型上的应用2.4 initializer_list2.4.1 {1, 2, 3} 的类型2.4.2 initializer_list 使用场景2.4.3 模拟实现的 vector 中的 { } 初始化和赋值 三、声明3.1 auto3.1…...

doris的be其中失败的原因

doris的be其中失败的原因 修改limits文件 vim /etc/security/limits.conf1在文件的末尾处添加或者修改 * soft nofile 204800 * hard nofile 204800 * soft nproc 204800 * hard nproc 204800vim /etc/sysctl.conf#添加 fs.file-max 6553560 vm.max_map_count 2000000 1 2…...

LeetCode 面试题 16.04. 井字游戏

文章目录 一、题目二、C# 题解 一、题目 设计一个算法&#xff0c;判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘&#xff0c;由字符" "&#xff0c;“X"和"O"组成&#xff0c;其中字符” "代表一个空位。 以下是井字游戏的规则&#…...

Nodejs和Node-red的关系

NPM相关知识 npm概念 npm&#xff1a;Node Package Manager&#xff0c;Node包管理器。是Node.js默认的&#xff0c;以JavaScript编写的软件包管理系统。 npm工作原理 npm的操作原理是各个官网使用npm publish把代码提交到npm的服务器&#xff0c;其他人想要使用这些代码&am…...

Spring Boot整合OAuth2实现GitHub第三方登录

Spring Boot整合OAuth2&#xff0c;实现GitHub第三方登录 1、第三方登录原理 第三方登录的原理是借助OAuth授权来实现&#xff0c;首先用户先向客户端提供第三方网站的数据证明自己的身份获取授权码&#xff0c;然后客户端拿着授权码与授权服务器建立连接获得一个Access Token…...

Android [SPI,AutoSerivce,ServiceLoader]

记录一下在Android中使用SPI的过程。 1.项目gralde文件。 plugins {id kotlin-kapt } dependencies {implementation com.google.auto.service:auto-service:1.0-rc7 kapt "com.google.auto.service:auto-service:1.0-rc7" } 这个AutoServ…...

【Linux】ASCII码表-256个

ASCII码简介: ASCII码 是现今最通用的单字节编码系统&#xff0c;并等同于国际标准ISO/IEC 646 。在这个页面&#xff0c;你可以找到8位的256个字符、ASCII码表和Windows-1252 (code page 1252&#xff0c;它是国际标准ISO 8859-1的一个扩展字符集) 标准保持一致;ASCII码 是 A…...

node.js - 上传文件至阿里云oss

deploy.js const fs require(fs) const path require(path) const util require(util) const OSS require(ali-oss)/*因为&#xff0c;在Node.js中&#xff0c;许多核心模块的函数都是采用回调函数的形式进行异步操作的&#xff0c;即在操作完成后调用回调函数来处理结果。…...

xxl-job项目集成实战,全自动项目集成,可以直接使用到项目中

如果你看官方文档&#xff0c;在研究透&#xff0c;至少也得几天时间&#xff0c;如果你直接看我的文档&#xff0c;快速用到项目中&#xff0c;也就10分钟就搞好了。 xxl-job功能确实很强大&#xff0c;而且使用的人比较多&#xff0c;既然在使用xxl-job&#xff0c;那肯定是…...

Qt生成PDF报告

文章目录 一、示意图二、实现部分代码总结 一、示意图 二、实现部分代码 //! 生成测试报告 void MainWindow::createPdf(QString filename, _pdf_msg_& msg, const QMap<QString, int>& ok, const QMap<QString, int>& err) {//QDir dir;if(!dir.exis…...

Jenkins 安装全攻略:从入门到精通

目录 一&#xff1a;安装文件夹准备 1.打开&#xff0c;/home/admin目录 2.新建三个文件夹 二&#xff1a;安装tomcat 1.打开tomcat目录进行tomcat安装 2.解压tomcat文件 3.开放端口号 4.启动tomcat 5.浏览器访问tomcat 三&#xff1a;安装Maven 1.打开maven目录进行…...

迎重阳,话养老:平安养老险如何助力国民“养老梦”?

10月23日&#xff0c;我们将迎来传统节日重阳节&#xff0c;又称敬老节&#xff0c;自古就有祭祖、登高、赏菊三大风俗&#xff0c;流传至今&#xff0c;已成为人们孝老敬老的重要节日。 随着老龄化日益加深&#xff0c;在“敬老”的同时如何“备老”成为人民群众长期热议的话题…...

微信小程序获取用户信息

个人博客 微信小程序获取用户信息 个人微信公众号&#xff0c;求关注&#xff0c;求收藏&#xff0c;求指错。 文章概叙 本文主要讲的是小程序获取用户信息的&#xff0c;更新测试时间是2023-10-25 更改原因 首先&#xff0c;官网上的解释是这样的&#xff0c;为了安全合…...

Mysql 索引原理和优化方式

一、索引原理 什么是索引 索引是存储引擎用于快速找到记录的一种数据结构。可以联想到字典中的目录。 索引的分类 &#xff08;1&#xff09; Hash 索引 Hash 索引是比较常见的一种索引&#xff0c;他的单条记录查询的效率很高&#xff0c;时间复杂度为1。但是&#xff0c…...

Ubuntu安装VM TOOLS解决虚拟机无法和WINDOWS粘贴复制问题

1&#xff1a;首先使用VMware Workstation安装一个Ubuntu的系统。 2&#xff1a;现在已经不建议安装VM TOOLS。建议安装OPEN-VM-TOOLS。 3&#xff1a;进入系统使用下面的命令安装。 sudo apt install open-vm-tools 4&#xff1a;提示下面错误&#xff0c;Package open-vm…...

【Docker】Docker Swarm介绍与环境搭建

为什么不建议在生产环境中使用Docker Compose 多机器如何管理&#xff1f;如何跨机器做scale横向扩展&#xff1f;容器失败退出时如何新建容器确保服务正常运行&#xff1f;如何确保零宕机时间&#xff1f;如何管理密码&#xff0c;Key等敏感数据&#xff1f; Docker Swarm介…...

国产CAN总线收发芯片DP1042 兼容替换TJA1042

说明 1 简述 DP1042是一款应用于 CAN 协议控制器和物理总线之间的接口芯片&#xff0c;可应用于卡车、公交、小汽车、工业控制等领域&#xff0c;支持 5Mbps CAN FD 灵活数据速率&#xff0c;具有在总线与 CAN 协议控制器之间进行差分信号传输的能力&#xff0c;完全兼容“ISO…...

[架构之路-243]:目标系统 - 纵向分层 - 架构是表面轮廓、内部骨架、未来蓝图,企业组织架构、信息系统架构、软件架构、应用程序就架构

目录 一、什么是架构 1.1 架构是表面轮廓 1.2 架构是内部骨架 1.3 架构是蓝图&#xff0c;是愿景 1.4 架构是数据流、控制流、管理流、同步流 1.5 数据、控制、同步、管理的比较 二、架构的层级 2.1 企业组织架构 2.2 企业系统架构 2.2 信息系统架构 2.3 软件架构 …...

【接口技术】定时计数器习题

1&#xff1a;8253芯片有______个端口地址。 【可选】 2 3 4 6 解答&#xff1a;4 2&#xff1a;8253芯片有______种工作方式。 【可选】 3 4 5 6 解答&#xff1a;6 3&#xff1a; 8253芯片内部有完全独立的______。 【可选】 6个16位计数通道 3个16位计数通道 6个8位计…...

DC电源模块的的散热结构合理布局

BOSHIDA DC电源模块的的散热结构合理布局 DC电源模块在工业控制、通讯、汽车电子等领域广泛应用。然而&#xff0c;随着功率密度不断提高&#xff0c;DC电源模块产生的热量也越来越大&#xff0c;散热问题变得越来越突出。为了保障电路的稳定性和可靠性&#xff0c;必须采取合…...

Fedora Linux 38下安装音频与视频的解码器和播放器

Fedora Linux 38 操作系统安装好后&#xff0c;默认是没有音频与视频的解码器的&#xff0c;音频与视频的播放体验非常差劲。但是第三方的软件源中有解码器和播放器的软件&#xff0c;需要我们自己手动安装。、 连接互联网&#xff0c;打开Shell命令行&#xff1a; 1. sudo d…...

边缘计算:云计算的延伸

云计算已经存在多年&#xff0c;并已被证明对大大小小的企业都有好处&#xff1b;然而&#xff0c;直到最近边缘计算才变得如此重要。它是指发生在网络边缘的一种数据处理&#xff0c;更接近数据的来源地。 这将有助于提高效率并减少延迟以及设备和云之间的数据传输成本。边缘…...

【经验分享】在Kylin桌面版操作系统中配置openGauss的ODBC数据源

引言 openGauss是一款开源的关系型数据库管理系统&#xff0c;它提供了强大的功能和性能&#xff0c;可以满足各种企业级应用的需求。与此同时&#xff0c;ODBC&#xff08;Open Database Connectivity&#xff09;是一个标准的数据库访问接口&#xff0c;它允许应用程序通过统…...

WSL——ubuntu中anaconda换源(conda、pip)

1、conda 打开Ubuntu&#xff0c;输入下列命令。 conda config --set show_channel_urls yes 在文件管理器地址栏&#xff0c;输入&#xff1a;\\wsl$。打开Ubuntu根路径&#xff0c;其中显示了.condarc文件。 以文本形式打开&#xff0c;并输入要换的源&#xff0c;保存即可。…...

IP地址在网络安全中的关键作用

IP地址&#xff08;Internet Protocol Address&#xff09;是互联网世界中的重要标识符&#xff0c;它在网络安全领域发挥着至关重要的作用。这些地址不仅帮助设备在网络上找到彼此&#xff0c;还在多个方面有助于维护网络的完整性、机密性和可用性。本文将探讨IP地址在网络安全…...

Android.mk 中覆盖应用包名

项目场景&#xff1a; 一般来讲应用包名都是配置在 AndroidManifest.xml 中的&#xff0c;但遇到特殊情况&#xff0c;需要修改源码中应用包名 通常都会先去改 AndroidManifest.xml package 但改为后编译发现一顿错误&#xff0c;原因是 java 类中已经指定了 R 文件包名&…...

如何最有效地使用ChatGPT:提问技巧与策略

前言 在如今信息技术高速发展的时代&#xff0c;像ChatGPT这样的大型自然语言处理模型为我们提供了一个强大的工具&#xff0c;以获取各种信息和答案。然而&#xff0c;要充分利用这一工具&#xff0c;您需要掌握一些提问技巧与策略&#xff0c;以确保获得最准确和有用的回答。…...

【JAVA学习笔记】40 - 抽象类、模版设计模式(抽象类的使用)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/abstract_ 一、抽象类的引入 很多时候在创建类的时候有一个父类&#xff0c;比如animal类&#xff0c;他的子类会有各种方法&#xff0c;为了复用需要进行方法的重写&…...

如何通过在线培训考试系统进行远程教育

随着互联网技术的不断发展&#xff0c;远程教育正在成为一种新型的学习方式&#xff0c;它使学生能够在任何地点、任何时间通过在线培训考试系统接受教育。 利用在线培训考试系统进行远程教育具有很大的灵活性。学生可以根据自己的时间和需求自由选择课程&#xff0c;无需受制…...

2021-arXiv-The Power of Scale for Parameter-Efficient Prompt Tuning

2021-arXiv-The Power of Scale for Parameter-Efficient Prompt Tuning Paper: https://arxiv.org/abs/2104.08691 Code: https://github.com/google-research/ text-to-text-transfer-transformer/ blob/main/released_checkpoints.md# lm-adapted-t511lm100k 在这项工作中&…...