码迷,mamicode.com
首页 > 编程语言 > 详细

逐个使用C++11新特性

时间:2019-03-23 16:11:19      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:one   com   标准   mamicode   指针   pac   algo   end   UNC   

C++11

auto & decltype

auto:根据变量初始值来推导变量类型,并用右值初始化变量。

技术图片

decltype:从表达式推导出类型,并将变量定义为该类型,但不用表达式的值初始化该变量。

技术图片

这里要注意下:decltype(i)--是i的类型,而decltype((i))就是引用了。就像上面例子中的x 就是int &x;

 

右值引用

新标准在拷贝构造函数、拷贝赋值运算符和析构函数之外,还增加了移动构造函数和移动赋值运算符,而这二位就需要右值引用的支持。

1. 延长将亡值的生命。

 1     //右值引用
 2     int a = 5;
 3     int &b = a;
 4     int &&bb = 89;//右值引用只能绑定将亡值
 5     //int &&bb = a;//错,a是左值(持久值)
 6     a = std::move(bb);//右值引用移动
 7 
 8     cout << "引用:" << b << endl;
 9     cout << "右值引用:" << bb << endl;
10     cout << "移动: " << a << endl;  
    

  &&bb = 999;//错,类似左值引用,不可二次复赋值
  &b = 888;//错

技术图片

我们居然输出了89,要知道,右值只是临时量,用完就扔的。

 2. 用于移动(构造)函数

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 class test
 7 {
 8 public:
 9     test();
10     ~test();
    void push(const int& i);
11 void push(int&& i) 12 { 13 bar = std::move(i);//std::move(右值引用)实现移动 14 } 15 private: 16 int bar; 17 }; 18 19 int main() 20 { 21 int a = 1; 22 test t; 23 t.push(1); 24 //t.push(a);错误无法将右值绑定到左值 25 26 return 0; 27 }

 

范围for循环 

统计字符

 1     string str = "No pain, no gain! Everyone need to struggle for himself.";
 2     decltype(str.length()) count = 0, count1 =0;
 3     for (auto i : str)
 4         if (ispunct(i))
 5             ++count;
 6         else
 7             ++count1;
 8     cout << "字符串长度:" << str.size() << endl;
 9     cout << "标点字符的个数:" << count << endl;
10     cout << "其他字符的个数:" << count1 << endl;

改写字符

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int main() 
 6 {
 7     string str("No pain, no gain! Everyone need to struggle for himself.");
 8     cout << str << endl;
 9 
10     for (auto &c : str)
11         c = toupper(c);//小写换大写
12 
13     cout << str << endl;;
14     return 0;
15 }

技术图片

去除字符

//去除标点 1 
#include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() 6 { 7 string input, res = ""; 8 while (cin >> input) 9 { 10 for (auto c : input) 11 if (!ispunct(c)) 12 res += c; 13 cout << res << endl; 14 res = ""; 15 } 16 }

 

智能指针

std::unique_ptr

std::weak_ptr & std::shared_ptr

 

lambda表达式

先看它怎么用

 1     //惯用法
 2     //[捕获外部变量](参数列表)->返回类型{ 函数体(别忘记";")}
 3     auto str = "I want you!";
 4     auto f = [](string str)->int { return str.size(); };
 5     cout << f(str) << endl;
 6 
 7     int m = 999;
 8     //捕获参数---值捕获
 9     auto getValue = [m] {cout << m << endl; };
10     getValue();
11     //捕获参数---引用捕获
12     auto getValue1 = [&m] {cout << m << endl; };
13     getValue1();
14 
15     //捕获参数---隐式值捕获
16     auto getValue2 = [=] {cout << m << endl; };
17     getValue2();
18 
19     //捕获参数---隐式引用捕获
20     auto getValue3 = [&] {
21         cout << m << endl; 
22         cout << "修改:" << ++m << endl;
23     };
24     getValue3();
25 
26     int num[5] = { 1, 5, 8, 2, 3 };
27     sort(num, num + 5, [](const int a, const int b) ->bool {return a > b; });
28 
29     for (auto i : num)
30         cout << i << " ";    

技术图片

它的优势在哪里?又或者说为什么要用它呢?

从上面的例子看来,我们可以很方便的实现“函数内的函数定义和使用”,即函数嵌套,这样一来就不用再在外部定义函数,然后才能使用。甚至,它连函数名都可以不要,就像上面的sort函数中的用法一样。极大的简化了我们的代码,可读性也增强了许多,不用再回到定义处推敲了。??

这里的lambda讲的很好


 

逐个使用C++11新特性

标签:one   com   标准   mamicode   指针   pac   algo   end   UNC   

原文地址:https://www.cnblogs.com/yocichen/p/10582605.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!