alin的学习之路:c++11 新特性

参考链接:https://blog.csdn.net/zzb2019/article/details/81624367

1. 关键字新增 auto decltype nullptr

1.1 自动类型推导 auto

auto a;// 错误,auto是通过初始化表达式进行类型推导,如果没有初始化表达式,就无法确定a类型
auto i = 1;
auto d = 1.0;
auto str = "Hello World";
auto ch = 'A';
auto func = less<int>();
vector<int> iv;
auto ite = iv.begin();
auto p = new foo() // 对自定义类型进行类型推导

1.2 decltype

decltype 则可以从一个变量或表达式中得到类型

  1. int x = 3;
  2. decltype(x)y = x;

declype(x) 表示 int

1.3 nullptr

nullptr代表的是空指针,NULL实际上代表的是0

1.4 constexpr

近似const, 可以修饰变量,也可以修饰函数,

修饰变量如:

const int global = 100;
int main () {int temp = 100;constexpr int a = 1; //rightconstexpr int b = global; //rightconstexpr int c = temp; //wrong
}

既可以赋值字面常量也可以赋值以const变量

重点:constexpr修饰的函数,生效于编译时而不是运行时, 重点应用于修饰函数使其在编译期大幅度被解释
被constexpr修饰的函数,无论是普通函数,还是类成员函数,必须是编译器可计算得到结果,即字面常量,不可是运行时才能获取的内容

1.5 using 代替 typedef

typedef double db; //c99using db = double; //c++11typedef void(*function)(int, int);//c99,函数指针类型定义using function = void(*)(int, int);//c++11,函数指针类型定义using kvpairs = std::map<std::string, std::string>; //c++11using CompareOperator = std::function<int (kvpairs &, kvpairs &)>; //c++11using query_record = std::tuple<time_t, std::string>; //c++11template<class T> using twins = std::pair<T, T>; //更广泛的还可以用于模板

2. 语法新特性

2.1 序列为循环(我理解为增强for循环)

map<int, int> mp;
for(auto m : mp)
{cout << m.first << " " << m.second << endl;
}

2.2 更优雅的初始化方法

int arr[3]{1, 2, 3};
vector<int> iv{1, 2, 3};
map<int, string>{{1, "a"}, {2, "b"}};
string str{"Hello World"};

不是仅仅可以用vector等容器的那些构造函数

2.3 Lambda表达式

匿名函数

[] 中填=号可以获得和这个函数相同作用域的访问权限,常用于一些函数中套的小函数,比如:sort,for_each

如果在小括号和大括号中间有 -> ,代表返回值的类型

比如for_each(iv.begin(), iv.end(), [=](int &x)->int{return x * (a + b);});

vector<int> v;
sort(v.begin(), v.end(), [](int v1, int v2){return v1 > v2;}); //降序排序

2.4 变长参数模板

auto t1 = make_tuple(1, 2.0, "C++ 11");
auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2});

类似于python中的tuple操作

2.5 std::chrono时间相关

std::chrono::duration<double> duration //时间间隔std::this_thread::sleep_for(duration); //sleepLOG(INFO) << "duration is " << duration.count() << std::endl;std::chrono::microseconds  //微秒std::chrono::seconds //秒end = std::chrono::system_clock::now(); //获取当前时间

3. 原生字符串

字符串中有很多特殊字符需要转义,造成了书写出来会不太方便看,原生字符串解决了这个问题

string path = R"(C:\Program Files\Microsoft.NET\ADOMD.NET)";

从上面的例子中可以看出,它的语法格式如下:

  1. 字符串前加’R’前缀
  2. 字符串首尾加上括号()

4. 容器

4.1 std::array

include <array>
int main()
{std::array<int, 4> arrayDemo = { 1,2,3,4 };std::cout << "arrayDemo:" << std::endl;for (auto itor : arrayDemo){std::cout << itor << std::endl;}int arrayDemoSize = sizeof(arrayDemo);std::cout << "arrayDemo size:" << arrayDemoSize << std::endl;return 0;
}

4.2 std::forward_list

与list区分,list是双向链表,std::forward_list是单向链表

在插入和删除时候,使用链表比线性表的效率要高

4.3 std::unordered_map

与map的区别在于插入一个数据后不会自动排序,内部结构与map不同,map是红黑树,std::unordered_map是哈希表。

在查询时间上,时间复杂度是O(1) ,但是空间复杂度上是O(n)

4.4 std::unordered_set

存储依然是哈希表的方式,在插入时不会自动排序

5. c++11风格的指针

5.1 函数指针

int func1 (int a, int b) {return a + b;
}auto a = 1, b = 2;
std::function<int (int, int)> modify_add0(func1);
LOG(INFO) << "directly assign function: " << modify_add0(a, b);

通过指定返回值、参数列表、绑定的函数和函数名,定义一个函数(指针) modify_add0 绑定的函数,可以是普通函数,也可以是类成员函数,同时指定:

class ca {public:bool func(int a) {LOG(INFO) << "aaa: " << a;}
};ca o;
std::function<bool (int)> f = std::bind(&ca::func, o, std::placeholders::_1);
f(1);

原先只有在boost出现且极为受限的函数占位符,也加入到了标准库,即std::placeholders,传递自定义参数绑定类成员函数时,需要配合使用std:bind。

bind和placeholders,同样可以用于普通函数:

int func1 (int a, int b) {b = a + a + a;return a + b;
}auto a = 1, b = 2;
auto auto1 = std::bind(func1, std::placeholders::_1, std::placeholders::_2);
LOG(INFO) << "directly run auto: " << auto1(a, b);

5.2 std::unique_ptr

功能基本对应boost的scoped_ptr,或之前stl的auto_ptr,生命周期随构造者,reset自动析构再重新构造,get判断是否有效、支持放在容器内;

5.3 std::shared_ptr

功能对于boost的shared_ptr,可以有多个持有者的共享指针,即所谓引用计数型指针,直到最后一个持有者delete释放时,其指向的资源才会真正被释放。
典型应用案例:如对同一个全局无锁队列对象由shared_ptr封装,多线程的多个持有者均持有对其的引用。直到全部线程都释放掉对其的引用时,该无锁队列对象才会被最终销毁。
也就是shared_ptr适合用于管理“全局动态资源”。
std::make_shared封装了new方法,boost::make_shared之前的原则是既然释放资源delete由智能指针负责,那么应该把new封装起来,否则会让人觉得自己调用了new,但没有调用delete,似乎与谁申请,谁释放的原则不符。

5.4 std::weak_ptr

std::weak_ptr网上很多人说其实是为了解决std::shared_ptr在相互引用的情况下出现的问题而存在的,C++官网对这个只能指针的解释也不多,那就先甭管那么多了,让我们暂时完全接受这个观点。
std::weak_ptr有什么特点呢?与std::shared_ptr最大的差别是在赋值时,不会引起智能指针计数增加。lock返回一个指向共享对象的shared_ptr。与任何其它shared_ptr类似,只要此shared_ptr存在,它所指向的底层对象也就会一直存在。

6. 多线程与互斥同步

6.1 std::thread

std::thread为C++11的线程类,使用方法和boost接口一样,非常方便,同时,C++11的std::thread解决了boost::thread中构成参数限制的问题,我想着都是得益于C++11的可变参数的设计风格。

#include <thread>
void threadfun1()
{std::cout << "threadfun1 - 1\r\n" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "threadfun1 - 2" << std::endl;
}void threadfun2(int iParam, std::string sParam)
{std::cout << "threadfun2 - 1" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(5));std::cout << "threadfun2 - 2" << std::endl;
}int main()
{std::thread t1(threadfun1);std::thread t2(threadfun2, 10, "abc");t1.join();std::cout << "join" << std::endl;t2.detach();std::cout << "detach" << std::endl;
}

6.2 原子变量

std::atomic
用于多线程资源互斥操作,属c++11重大提升,多线程原子操作简单了许多。
从功能上看,简单地说,原子数据类型不会发生数据竞争,能直接用在多线程中而不必我们用户对其进行添加互斥资源锁的类型。从实现上,大家可以理解为这些原子类型内部自己加了锁。

#include <thread>
#include <atomic>
#include <stdio.h>
std::atomic_bool bIsReady = false;
std::atomic_int iCount = 100;
void threadfun1()
{if (!bIsReady) {std::this_thread::yield();}while (iCount > 0){printf("iCount:%d\r\n", iCount--);}
}int main()
{std::atomic_bool b;std::list<std::thread> lstThread;for (int i = 0; i < 10; ++i){lstThread.push_back(std::thread(threadfun1));}for (auto& th : lstThread){th.join();}
}

6.3 std::condition_variable

C++11中的std::condition_variable就像Linux下使用pthread_cond_wait和pthread_cond_signal一样,可以让线程休眠,直到别唤醒,现在在从新执行。线程等待在多线程编程中使用非常频繁,经常需要等待一些异步执行的条件的返回结果。

// condition_variable example
#include <iostream>      // std::cout
#include <thread>       // std::thread
#include <mutex>        // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variablestd::mutex mtx;
std::condition_variable cv;
bool ready = false;void print_id(int id) {std::unique_lock<std::mutex> lck(mtx);while (!ready) cv.wait(lck);// ...std::cout << "thread " << id << '\n';
}void go() {std::unique_lock<std::mutex> lck(mtx);ready = true;cv.notify_all();
}int main()
{std::thread threads[10];// spawn 10 threads:for (int i = 0; i<10; ++i)threads[i] = std::thread(print_id, i);std::cout << "10 threads ready to race...\n";go();            // go!for (auto& th : threads) th.join();return 0;
}

alin的学习之路:c++11特性相关推荐

  1. alin的学习之路:面试题 数据库相关

    alin的学习之路:面试题 数据库相关 如何提高查询速度? 使用索引 create index 索引名 on 表名(列名1,列名2,--); 数据库索引,事务,事务级别 使用索引可以提高查询效率 事务 ...

  2. alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组)

    alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组) 1. SQL语句 1.1 sql语言类型 sql是一门独立的 ...

  3. alin的学习之路:加密相关知识(加密和解密,常见加密算法,消息验证码HMAC,数字签名)

    alin的学习之路:加密相关知识(加密和解密,常见加密算法,消息验证码HMAC,数字签名) 1. 加密和解密 1.1 加密的三要素 原始数据 加密操作: 明文 -> 密文 解密操作: 密文 -& ...

  4. alin的学习之路(数据库篇:三)(多表查询,子查询,集合运算,数据处理)

    alin的学习之路(数据库篇:三)(多表查询,子查询,集合运算,数据处理) 1. 多表查询 1.1 笛卡儿积 笛卡尔积就是两个集合的乘积计算 . 如果多个表进行联合查询, 得到结果是一个笛卡尔积, 举 ...

  5. alin的学习之路(数据库篇:五)(MySQL的相关语句及API的C语言实现)

    alin的学习之路(数据库篇:五)(MySQL的相关语句及API的C语言实现) 1. MySQL概述与登陆MySQL mysql 与 oracle 的区别 oracle 是一个数据库实例下有多个用户, ...

  6. alin的学习之路:设计模式之单例模式

    alin的学习之路:设计模式之单例模式 单例模式,顾名思义就是类只有一个实例对象,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象. 单例模式 ...

  7. alin的学习之路(Linux系统编程:三)(vim,gcc,库,gdb)

    alin的学习之路(Linux系统编程:三)(vim,gcc,库,gdb) 1.vim的使用 vim有三种模式:命令模式,末行模式,编辑模式 光标的移动[命令模式] h 向左 ,j 向下,k 向上,l ...

  8. alin的学习之路:共享内存

    alin的学习之路:共享内存 1. 概念 共享内存是进程间通信中效率最高的一种方式. 共享内存: 可以被多个进程同时使用的一块内核的内存 有血缘关系的进程 没有血缘关系的进程 这块内存不属于任何的进程 ...

  9. alin的学习之路:面试题 计算机网络相关

    alin的学习之路:面试题 计算机网络相关 介绍下proactor和reactor reactor:同步IO proactor:异步IO Reactor框架中用户定义的操作是在实际操作之前调用的.比如 ...

最新文章

  1. 检测到你的手机处于root环境_选择群控系统的注意事项!繁星云手机盒子会比群控更合适好用吗!...
  2. iOS开发之自定义View
  3. php程序时间数字,php – 给数字发短信的时间
  4. jquery表单验证源码
  5. 马云又出金句:文凭只是学费的收据,真正的文凭是生活中奋斗来的
  6. 比特币 出块速度多少 为什么每秒7笔 以太坊15TPS
  7. 分享一段php获取随意时间的前一天代码
  8. adb连接 vivo_vivoadb工具包下载|vivo安卓adb工具1.0.32 最新版_ - 极光下载站
  9. linux达梦数据库执行sql脚本
  10. 计网 | 链路层协议及大题解构
  11. java异步队对联_对联广告(带关闭的)
  12. java的listroots_Java File listRoots()用法及代码示例
  13. 三菱或尝试抛弃后视镜,使用摄像头和AI技术来导航
  14. Java岗面试:mysql破解版百度云
  15. 给定经纬度计算距离_根据经纬度计算两点间距离JAVA版
  16. 品牌公关与传统媒体有什么关联和作用
  17. 《机器学习实战》—— 决策树
  18. Gitea+Drone(K8S CI/CD)2
  19. 特许市场技术分析师(CMT)推荐材料
  20. 微信公众号发送小程序卡片_微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力...

热门文章

  1. python读取多张图片_Matplotlib显示多张图片
  2. 淡马锡:48年新加坡「最强国企」,深入布局Web3
  3. Git的提交说明规范
  4. 探索职业:如何用英语询问别人的职业
  5. unity实现 魔兽争霸3地图拼接(例子)
  6. .Net应用程序 参照的组合没有安装在您的系统中。 HRESULT: 0x800736B3
  7. 必读,一文普及MES系统知识
  8. css3 效果全(旋转,放大,倾斜,平移)
  9. feed流和瀑布流_什么叫feed流?
  10. android 打印机服务,Android系统打印服务插件printservice开发