织梦cms做网站/企业查询天眼查

织梦cms做网站,企业查询天眼查,开发公司认领工程网站,做钢材生意选什么网站目录 1.列表初始化 {}初始化 C98中 C11中 内置置类型和自定义类型 创建对象也适用 std::initializer_list 2.变量类型推导 auto C98 C11 decltype nullptr 3.范围for循环 4.STL中一些变化 array 1.创建和初始化 2.访问元素 ​编辑 3.修改操作 4.支持迭代器…

目录

1.列表初始化

{}初始化

C++98中

C++11中

内置置类型和自定义类型

创建对象也适用

std::initializer_list

2.变量类型推导

auto

C++98

C++11

decltype

nullptr

3.范围for循环

4.STL中一些变化

array

1.创建和初始化

2.访问元素

​编辑

3.修改操作

4.支持迭代器

forward_list

1.创建和初始化

2.访问元素

3.修改操作

4.支持迭代器

5.右值引用和移动语义

左值引用和右值引用

左值:

右值:

C++11进一步细分:

使用场景

1.函数重载

2.移动语义 (移动构造)

移动构造的触发场景

a. 显式使用 std::move

b.函数返回临时对象

c.接收返回值的构造

d.标准库容器操作

3. 完美转发

4.特殊案例

返回左值引用的函数

5.左值与右值的对比

6.左值引用与右值引用的对比

7.左值引用的短板

用右值引用和移动语义可以解决上述问题:

8.右值引用引用引用左值


1.列表初始化

{}初始化

C++98中
标准允许使用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定
struct Point
{int _x;int _y;
};int main()
{int array1[] = { 1, 2, 3, 4, 5 };int array2[5] = { 0 };Point p = { 1, 2 };return 0;
}
C++11中
内置置类型和自定义类型

扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加

struct Point
{int _x;int _y;
};int main()
{int x1 = 1;int x2{ 2 };int array1[] = { 1, 2,3 ,4, 5 };int array2[]{ 1,2,3,4,5 }; // 可加等号,也可不加Point p{ 1, 2 };// c++11中列表初始化也可以适用于new表达式中int* pa = new int[4] {0};return 0;
}
创建对象也适用
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); // 旧时用法// C++11支持的列表初始化,这里会调用构造函数初始化Date d2{ 2022, 1, 2 };Date d3 = { 2022, 1, 3 }; // 等号可用可不用return 0;
}

std::initializer_list

int main()
{// the type of il is an initializer_list auto il = { 10, 20, 30 };cout << typeid(il).name() << endl;return 0;
}

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

int main()
{vector<int> v = { 1,2,3,4 };list<int> lt = { 1,2 };// 这里{"sort", "排序"}会先初始化构造一个pair对象map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };// 使用大括号对容器赋值v = { 10, 20, 30 };return 0;
}

2.变量类型推导

auto

C++98
C++98 auto 是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto 就没什么价值了。
int main() {auto int x = 10;  // C++98: auto 表示 x 是自动存储类型(默认就是 auto,所以多余)int y = 20;       // 默认就是 auto,等同于 auto int y = 20;return 0;
}
结论:auto 在 C++98 中几乎没用,因为局部变量默认就是 auto。
C++11
C++11 中废弃 auto 原来的用法,将 其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初 始化值的类型
C++11 废弃了 auto 的旧用法,并赋予它 自动类型推断 的功能:
1.auto 可以让编译器自动推断变量的类型,但必须 显式初始化(即必须赋值)。
2.适用于复杂类型、模板、迭代器等场景,减少代码冗余。
int main() {// 基本类型auto x = 10;          // x 的类型是 int(编译器自动推断)auto y = 3.14;        // y 的类型是 doubleauto name = "Alice";  // name 的类型是 const char*// STL 容器(避免写冗长的类型)std::vector<std::string> names = { "Alice", "Bob", "Charlie" };auto it = names.begin();  // it 的类型是 std::vector<std::string>::iterator// 范围 for 循环(C++11 新增)for (auto& n : names) {   // n 的类型自动推断为 std::string&std::cout << n << "\n";}return 0;
}

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');return 0;
}

nullptr

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

3.范围for循环

范围 for 循环是 C++11 引入的一种简化遍历容器(如数组、vectorlist 等)的语法,它可以自动迭代容器中的所有元素,无需手动管理迭代器或下标。

#include <iostream>int main() 
{int arr[] = {1, 2, 3, 4, 5};// 使用范围 for 遍历数组for (auto num : arr) // num 会自动推断为 int{  std::cout << num << " ";}// 输出:1 2 3 4 5return 0;
}

应用范围很广,比起其他的遍历方式,其简单又便捷

4.STL中一些变化

STL新增了一些容器(上图圈出来的)

array

std::array 是 C++11 引入的一个固定大小的顺序容器,它结合了 C 风格数组的性能和标准容器的便利接口。

与普通数组做比较:

1.创建和初始化
int main() 
{// 创建并初始化std::array<int, 5> arr1 = { 1, 2, 3, 4, 5 };// 统一初始化 (C++11) -- 列表初始化std::array<int, 3> arr2{7, 8, 9};// 默认初始化 (元素值未定义)std::array<double, 4> arr3;// 全部初始化为0std::array<int, 5> arr4{};return 0;
}
2.访问元素
int main()
{std::array<int, 5> nums = { 10, 20, 30, 40, 50 };// 使用下标访问 (不检查边界)int x = nums[2];  // 30// 使用at()访问 (检查边界)int y = nums.at(3);  // 40// nums.at(5) 会抛出 std::out_of_range 异常// 访问首尾元素int first = nums.front();  // 10int last = nums.back();    // 50// 打印出来std::cout << x << " " << y << " " << first << " " << last << std::endl;// 使用迭代器for (auto it = nums.begin(); it != nums.end(); ++it) {std::cout << *it << " ";}return 0;
}
3.修改操作
int main()
{std::array<int, 5> nums{1, 2, 3, 4, 5};// 填充值nums.fill(10);  // 所有元素变为10// 交换两个arraystd::array<int, 5> other{5, 4, 3, 2, 1};nums.swap(other);  // nums和other内容交换return 0;
}
4.支持迭代器
int main()
{std::array<std::string, 3> colors{"red", "green", "blue"};// 正向迭代for (auto it = colors.begin(); it != colors.end(); ++it) {std::cout << *it << " ";}// 反向迭代for (auto rit = colors.rbegin(); rit != colors.rend(); ++rit) {std::cout << *rit << " ";}// 范围for循环 (C++11)for (const auto& color : colors) {std::cout << color << " ";}return 0;
}

forward_list

std::forward_list 是 C++11 引入的单向链表容器,比 std::list 更节省内存,但功能稍有限制。

与 std::list 的比较:

1.创建和初始化
int main() 
{// 创建空链表std::forward_list<int> flist1;// 创建并初始化std::forward_list<int> flist2 = { 1, 2, 3, 4, 5 };// 指定大小和默认值std::forward_list<int> flist3(5, 100); // 5个元素,每个都是100return 0;
}
2.访问元素
int main()
{std::forward_list<int> nums = { 10, 20, 30, 40, 50 };// 访问第一个元素int first = nums.front();  // 10// 不能直接访问最后一个元素(需要遍历)// nums.back() 不存在!// 遍历所有元素for (int num : nums) {std::cout << num << " ";}return 0;
}
3.修改操作
int main()
{std::forward_list<int> nums = { 1, 2, 3 };// 在前面插入元素nums.push_front(0);  // 现在: 0, 1, 2, 3// 删除第一个元素nums.pop_front();    // 现在: 1, 2, 3// 在特定位置后插入元素auto it = nums.begin();nums.insert_after(it, 99);  // 现在: 1, 99, 2, 3// 删除特定位置后的元素nums.erase_after(it);       // 现在: 1, 2, 3return 0;
}
4.支持迭代器
int main()
{std::forward_list<int> flist = { 1, 2, 3, 4, 5 };// 获取指向第一个元素的迭代器auto begin_it = flist.begin();// 获取尾后迭代器auto end_it = flist.end();// 传统方式遍历for (auto it = flist.begin(); it != flist.end(); ++it) {std::cout << *it << " ";}// 范围for循环 (推荐)for (const auto& elem : flist) {std::cout << elem << " ";}return 0;
}

5.右值引用和移动语义

传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性

左值引用和右值引用

左值:

左值是指那些有明确内存地址可以取地址的表达式,通常代表一个持久存在的对象。

特点:

1.可以出现在赋值语句的左侧

2.有持久的状态(超出单个表达式仍然存在)

3.可以取地址(使用&运算符)

int x = 10;    // x是左值
int* p = &x;   // 可以取x的地址
x = 20;        // x可以出现在赋值左侧
右值:

右值是指临时对象即将被销毁的对象,通常代表一个短暂存在的值。

特点:

1.只能出现在赋值语句的右侧

2.通常是临时对象或字面量

3.不能取地址

int x = 10;        // 10是右值
int y = x + 5;     // (x+5)是右值
std::string s = "hello";  // "hello"是右值
C++11进一步细分:

使用场景

1.函数重载

2.移动语义 (移动构造)
class MyString {
public:// 移动构造函数MyString(MyString&& other) {  // 接受右值引用data = other.data;other.data = nullptr;}private:int* data;
};
移动构造的触发场景
a. 显式使用 std::move
vector<string> func() {vector<string> local;return std::move(local);  // 强制移动(但可能阻止RVO)
}
b.函数返回临时对象
vector<string> getTemp() {return vector<string>{"a", "b", "c"};  // 临时对象必然移动
}
c.接收返回值的构造
class String {char* data;
public:// 移动构造函数String(String&& other) noexcept : data(other.data) {  // 窃取资源other.data = nullptr;}~String() { delete[] data; }
};String createString() {String temp("hello");return temp;  // 返回值优化或移动
}/// ----------------->>
vector<String> strs = createStrings();  // 移动构造或RVO
d.标准库容器操作
vector<string> v1 = {"a", "b"};
vector<string> v2;
v2 = std::move(v1);  // 移动赋值
3. 完美转发
template<typename T>
void relay(T&& arg) {  // 万能引用process(std::forward<T>(arg));  // 完美转发
}

1. 万能引用(Universal Reference)

T&& arg 中的 && 并不总是表示右值引用。当 T 是模板参数时,T&& 是一个"万能引用",它能绑定到左值或右值
 

int x = 10; 
relay(x);      // T被推导为int&,arg绑定到左值
relay(20);     // T被推导为int,arg绑定到右值

2. std::forward 的作用

std::forward<T>(arg) 会根据原始参数的值类别决定转发方式

        a.如果原始参数是左值,转发为左值

        b.如果原始参数是右值,转发为右值

4.特殊案例
返回左值引用的函数
int& getRef() { static int x; return x; }int main()
{getRef() = 5;  // 函数调用是左值return 0;
}

getRef() 返回的是变量x的引用,因此整个函数调用表达式可以当作x本身使用,包括:

1.出现在赋值左侧

2.取地址

3.绑定到非const左值引用

5.左值与右值的对比

6.左值引用与右值引用的对比

7.左值引用的短板
但是当函数返回对象是一个局部变量,出了函数作用域就不存在了,就不能使用左值引用返回,只能传值返回。
例如:bit::string to_string(int value) 函数中可以看到,这里只能使用传值返回,传值返回会导致至少1 次拷贝构造 ( 如果是一些旧一点的编译器可能是两次拷贝构造 )

右值引用和移动语义可以解决上述问题:
bit::string 中增加移动构造 移动构造本质是将参数右值的资源窃取过来,占位已有,那么就不 用做深拷贝了,所以它叫做移动构造,就是窃取别人的资源来构造自己
// 移动构造
string(string&& s):_str(nullptr), _size(0), _capacity(0)
{cout << "string(string&& s) -- 移动语义" << endl;swap(s);
}int main()
{bit::string ret2 = bit::to_string(-1234);return 0;
}
8.右值引用引用引用左值
void push_back(value_type&& val);int main()
{list<YC::string> lt;YC::string s1("1111");// 这里调用的是拷贝构造lt.push_back(s1);// 下面调用都是移动构造lt.push_back("2222");lt.push_back(std::move(s1));return 0;
}// 运行结果:
// string(const string& s) -- 深拷贝
// string(string&& s) -- 移动语义
// string(string&& s) -- 移动语义

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

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

相关文章

MongoDB 实际工作中应用场景

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

GitHub美化个人主页3D图表显示配置操作

这个功能主要是用的这个开源仓库&#xff1a;https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话&#xff0c;我的个人主页&#xff1a;https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可&#xff0c;…

buu-jarvisoj_fm-好久不见52

格式化字符串漏洞题 x等于4x等于4​​​​​​​x等于4​​​​​​​x等于4 可以知道是第11个参数&#xff0c;%11$ 定位到这个位置&#xff0c;然后%n往这个位置写入4 1.先用pwndbg调试得到偏移量 2.查看获取x的地址 3.构造ROP链&#xff0c;发送连接 from pwn import *# …

AwesomeQt分享3(含源码)

AwesomeQt 这个项目包含了多个Qt组件的使用示例&#xff0c;旨在展示Qt各种强大功能的实现方式。 源码分享 github: awesome_Qtgitee: 后续同步 项目进度 QCustomPlot曲线控件示例 支持排序和筛选的列表控件示例 支持排序和筛选的表格控件示例 属性表示例 Dock窗口示例 自绘…

ubuntu 安装 g++

文章目录 前提一、安装 g1.1 安装1.2 验证 前提 安装 tflite_support 报错 error: subprocess-exited-with-error RuntimeError: Unsupported compiler -- at least C11 support is needed!一、安装 g 1.1 安装 # 安装编译工具链&#xff08;如g&#xff09;和依赖库 sudo …

【NLP 50、损失函数 KL散度】

目录 一、定义与公式 1.核心定义 2.数学公式 3.KL散度与交叉熵的关系 二、使用场景 1.生成模型与变分推断 2.知识蒸馏 3.模型评估与优化 4.信息论与编码优化 三、原理与特性 1.信息论视角 ​2.优化目标 3.​局限性 四、代码示例 代码运行流程 核心代码解析 抵达梦想靠的不是狂热…

使用QT画带有透明效果的图

分辨率&#xff1a;24X24 最大圆 代码: #include <QApplication> #include <QImage> #include <QPainter>int main(int argc, char *argv[]) {QImage image(QSize(24,24),QImage::Format_ARGB32);image.fill(QColor(0,0,0,0));QPainter paint(&image);…

【Unity网络编程知识】使用Socket实现简单TCP通讯

1、Socket的常用属性和方法 创建Socket TCP流套接字 Socket socketTcp new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 1.1 常用属性 1&#xff09;套接字的连接状态 socketTcp.Connected 2&#xff09;获取套接字的类型 socketTcp.So…

Yolo_v8的安装测试

前言 如何安装Python版本的Yolo&#xff0c;有一段时间不用了&#xff0c;Yolo的版本也在不断地发展&#xff0c;所以重新安装了运行了一下&#xff0c;记录了下来&#xff0c;供参考。 一、搭建环境 1.1、创建Pycharm工程 首先创建好一个空白的工程&#xff0c;如下图&…

时尚界正在试图用AI,创造更多冲击力

数字艺术正以深度融合的方式&#xff0c;在时尚、游戏、影视等行业实现跨界合作&#xff0c;催生了多样化的商业模式&#xff0c;为创作者和品牌带来更多机会&#xff0c;数字艺术更是突破了传统艺术的限制&#xff0c;以趣味触达用户&#xff0c;尤其吸引了年轻一代的消费群体…

数据库原理及应用mysql版陈业斌实验二

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验二单表查询 1.实验数据如下 student 表&#xff08;学生表&#…

SDL —— 将sdl渲染画面嵌入Qt窗口显示(附:源码)

🔔 SDL/SDL2 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 效果 使用QWidget加载了SDL的窗口,渲染器使用硬件加速跑GPU的。支持Qt窗口缩放或显示隐藏均不影响SDL的图像刷新。   操作步骤 1、在创建C++空工程时加入SDL,引入头文件时需…

C语言之链表增删查改

1.知识百科 链表&#xff08;Linked List&#xff09;是计算机科学中一种基础的数据结构&#xff0c;通过节点&#xff08;Node&#xff09;的链式连接来存储数据。每个节点包含两部分&#xff1a;存储数据的元素和指向下一个节点的指针&#xff08;单链表&#xff09;或前后两…

Windows环境下AnythingLLM安装与Ollama+DeepSeek集成指南

前面已经完成了Ollama的安装并下载了deepseek大模型包&#xff0c;下面介绍如何与anythingLLM 集成 Windows环境下AnythingLLM安装与OllamaDeepSeek集成指南 一、安装准备 1. 硬件要求 如上文说明 2. 前置条件 已安装Ollama并下载DeepSeek模型&#xff08;如deepseek-r1:…

当贝AI知识库评测 AI如何让知识检索快人一步

近日,国内领先的人工智能服务商当贝AI正式推出“个人知识库”功能,这一创新性工具迅速引发行业关注。在信息爆炸的时代,如何高效管理个人知识资产、快速获取精准答案成为用户的核心需求。当贝AI通过将“闭卷考试”变为“开卷考试”的独特设计,为用户打造了一个高度个性化的智能…

HarmonyOS NEXT——【鸿蒙原生应用加载Web页面】

鸿蒙客户端加载Web页面&#xff1a; 在鸿蒙原生应用中&#xff0c;我们需要使用前端页面做混合开发&#xff0c;方法之一是使用Web组件直接加载前端页面&#xff0c;其中WebView提供了一系列相关的方法适配鸿蒙原生与web之间的使用。 效果 web页面展示&#xff1a; Column()…

MES系统需要采集的数据及如何采集

​数据采集在企业信息化建设中占据着举足轻重的地位&#xff0c;是实现物料跟踪、生产计划制定、产品历史记录维护以及其他生产管理活动的基石。数据的准确性和实时性直接关系到企业信息化能否成功落地&#xff0c;是企业迈向高效生产的关键因素。 数据收集对于MES制造执行系统…

Uni-app页面信息与元素影响解析

获取窗口信息uni.getWindowInfo {pixelRatio: 3safeArea:{bottom: 778height: 731left: 0right: 375top: 47width: 375}safeAreaInsets: {top: 47, left: 0, right: 0, bottom: 34},screenHeight: 812,screenTop: 0,screenWidth: 375,statusBarHeight: 47,windowBottom: 0,win…

Problem A: 计算奇数和

补充&#xff08;牢骚&#xff09;&#xff1a; 必须要 Main 类&#xff0c;自己自定义的类不能跑&#xff0c;说实话我被恶心到了&#xff0c;真没力扣好用。后面都默认为Main 类。真恶心&#xff0c;其实不止这一点。。。 1.题目问题 2.输入 3.输出 4.样例 5.代码实现 imp…

深度赋能!北京智和信通融合DeepSeek,解锁智能运维无限可能

在数字化飞速发展的今天&#xff0c;传统运维模式面临着设备规模激增、故障复杂度攀升、人工响应滞后等多重挑战。随着DeepSeek、腾讯元宝等AI大模型的兴起&#xff0c;为传统运维模式带来了新的变革。 北京智和信通基于DeepSeek大模型技术&#xff0c;将AI和运维场景深度融合&…