C++11新特性概述,初始化,auto、for、智能指针、哈希表等( 二 )


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;}运行结果:
C++11新特性概述,初始化,auto、for、智能指针、哈希表等

文章插图
 
  • 哈希表(无序容器)
(1)哈希表的两个特点:
1、哈希表内部存储的键值对是无序的,各键值对的存储位置取决于该键值对中的键 。
2、与关联式容器相比,哈希表擅长通过指定键查找对应的值(平均时间复杂度为 O(1)),但对于使用迭代器遍历容器中存储的元素,无序容器的执行效率则不如关联式容器 。
(2)无序容器:unordered_map、unordered_multimap、unordered_set 、unordered_multiset 。
C++11新特性概述,初始化,auto、for、智能指针、哈希表等

文章插图
 
#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;}运行结果:
 
C++11新特性概述,初始化,auto、for、智能指针、哈希表等

文章插图
 
  • 正则表达式
本质上就是一个字符串,这些字符串具有特殊含义,可以用于查找、替换符合规则的字符串 。常用符号
C++11新特性概述,初始化,auto、for、智能指针、哈希表等

文章插图
 
  • Lambda表达式
没有名称的函数 。格式
[外部变量访问方式说明符] (参数) mutable noexcept/throw() -> 返回值类型 { 函数体; };
(1)[外部变量访问方式说明符]  。[ ] 方括号用于向编译器表明当前是一个 lambda 表达式,其不能被省略 。在方括号内部,可以注明当前 lambda 函数的函数体中可以使用哪些“外部变量” 。
(2)(参数)。与普通函数的定义一样,lambda 匿名函数也可以接收外部传递的多个参数 。和普通函数不同的是,如果不需要传递参数,可以连同 () 小括号一起省略;


推荐阅读