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::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函数中的用法一样。极大的简化了我们的代码,可读性也增强了许多,不用再回到定义处推敲了。??
逐个使用C++11新特性
原文地址:https://www.cnblogs.com/yocichen/p/10582605.html
时间: 2024-10-13 11:32:13