int num = 1103;int &b = num; //正确int &c = 1103; //错误
上面这种引用,在C++98/03 标准中的引用又称为左值引用 。虽然不支持为右值建立非常量左值引用,但允许使用常量左值引用操作右值 。
int num = 1103;const int &b = num;const int &c = 1103;
右值往往是没有名称的,因此要使用它只能借助引用的方式 。这样就会产生一个问题,在实际开发中,我们可能需要对右值进行修改(实现移动语义时就需要),显然上面左值引用的方式是行不通的 。
C++11 标准新引入了另一种引用方式,称为右值引用,用 "&&" 表示
int num = 1103;//int && a = num;//右值引用不能初始化为左值int && a = 1103;
与常量左值引用不同的是,右值引用还可以对右值进行修改 。
int && a = 1103;a = 100;cout << a << endl;/*程序运行结果:100*/
C++ 语法上是支持定义常量右值引用的
const int&& a = 10;//编译器不会报错
这种定义出来的右值引用并无实际意义 。一方面,右值引用主要用于移动语义和完美转发,其中前者需要有修改右值的权限;其次,常量右值引用的作用就是引用一个不可修改的右值,这项工作完全可以交给常量左值引用完成 。
- move语义
move( arg ) //其中,arg 表示指定的左值对象 。该函数会返回 arg 对象的右值形式 。
#include <iostream>#include <vector>#include <string>using namespace std;int main(){string str = "Hello";vector<string> v;//调用常规的拷贝构造函数,新建字符数组,拷贝数据v.push_back(str);cout << "After copy, str is:" << str << endl;//调用移动构造函数,掏空str,掏空后,最好不要使用strv.push_back(move(str));cout << "After move, str is :" << str << endl;cout << "The contents of the vector are :" << v[0]<< "t" << v[1] << endl;return 0;}
运行结果:文章插图
- 哈希表(无序容器)
1、哈希表内部存储的键值对是无序的,各键值对的存储位置取决于该键值对中的键 。
2、与关联式容器相比,哈希表擅长通过指定键查找对应的值(平均时间复杂度为 O(1)),但对于使用迭代器遍历容器中存储的元素,无序容器的执行效率则不如关联式容器 。
(2)无序容器:unordered_map、unordered_multimap、unordered_set 、unordered_multiset 。
文章插图
#include <iostream>#include <string>#include <unordered_map>using namespace std;int main(){//创建并初始化一个 unordered_map 容器,其存储的 <string,string> 类型的键值对unordered_map<string, string> myMap{{"C语言教程","www.123.com"},{"C++语言教程","www.234.com"},{"Python语言教程","www.345.com"}};//查找指定键对应的值,效率比关联式容器高string str = myMap.at("C语言教程");cout << "str = " << str << endl;//使用迭代器遍历哈希容器,效率不如关联式容器for (auto iter = myMap.begin(); iter != myMap.end(); ++iter){//pair 类型键值对分为 2 部分cout << iter->first << " " << iter->second << endl;}return 0;}
运行结果:文章插图
- 正则表达式
文章插图
- Lambda表达式
[外部变量访问方式说明符] (参数) mutable noexcept/throw() -> 返回值类型 { 函数体; };
(1)[外部变量访问方式说明符] 。[ ] 方括号用于向编译器表明当前是一个 lambda 表达式,其不能被省略 。在方括号内部,可以注明当前 lambda 函数的函数体中可以使用哪些“外部变量” 。
(2)(参数)。与普通函数的定义一样,lambda 匿名函数也可以接收外部传递的多个参数 。和普通函数不同的是,如果不需要传递参数,可以连同 () 小括号一起省略;
推荐阅读
- 谷歌Chrome浏览器正获得全新截图工具
- 互联网革命的新赛道——Web3.0
- iQOO|新一代千元“神机”!iQOO Neo6 SE入网信息曝光:骁龙870+80W快充
- 圣莫尼卡|比恶魔猎手更强大!魔兽世界10.0新职业唤魔师诠释何为真正英雄
- 怎么买玉
- 穿衣搭配|公务员迎来“新政策”,招考或将成了过去式,这些考生别错过了!
- 新疆和北京的时差是几个小时?
- 怎么自制红茶,新鲜苦瓜茶的泡法
- 如何加快新陈代谢
- 大众|人人开得起!曝大众将打造全新入门级电动车