逐个使用C++11新特性

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新特性

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

时间: 2024-08-09 12:51:00

逐个使用C++11新特性的相关文章

C++11 新特性(2) 移动语义

C++11支持移动语义. 一:为什么需要移动语义和什么是移动语义 我们先来看看C++11之前的复制过程.假设有下列代码: vector<string> v1(1000000);//v1存放着100W个string,假设每个string长度为1000 vector<string> v2(v1);//使用v1初始化v2 vector和string类都使用动态内存分配,因此他们必须定义使用他们自己的new版本的复制构造函数. 复制构造函数vector<string>将使用ne

C++11——新特性总结

前言: 开学过去一个半月了,说来十分惭愧,由于和女友最后还是分开了,导致这段时间一直在沉沦,每天晚上回去打打lol或者cs,就睡觉,基本上把我自己定下的自学目标给抛弃了.好在这段时间里还是凭借以前的基础投了不少岗位,也笔试了不少公司,基本都通过了笔试.第一次面试是网易,结果在最后一轮的技术面上挂了下来.其实回想起来,当时问的问题我其实之前都有仔细的专研过,只不过时间太久忘了罢了.这也要怪我自己准备不够充分.之前腾讯的笔试,我其实感觉自己是做砸了的,不过没想到还是得到了面试机会,就在两天之后的下午

C++11 新特性之 tuple

我们在C++中都用过pair.pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同.pair可以使用make_pair构造 pair<int, string> p = make_pair(1, "a1"); 如果传入的参数为多个,那么就需要嵌套pair,如下代码 #include <iostream> #include <map> using namespace std; int main() { //<int, string,

C++11 新特性之 变长参数模板

template <typename ... ARGS> void fun(ARGS ... args) 首先明确几个概念 1,模板参数包(template parameter pack):它指模板参数位置上的变长参数,例如上面例子中的ARGS 2,函数参数包(function parameter pack):它指函数参数位置上的变长参数,例如上面例子中的args 一般情况下 参数包必须在最后面,例如: template <typename T, typename ... Args>

【C++11】30分钟了解C++11新特性

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外). C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decl

[C++11新特性]第二篇

0.可变数量参数,可变函数模版,变长模版类 c++98可变数量参数 #include<cstdio> #include<cstdarg> double SumOfFloat(int count, ...) { va_list ap; double sum=0; va_start(ap,count); for(int i=0;i<count;i++) sum+=va_arg(ap,double); va_end(ap); return sum; } int main() { p

C++11 新特性(5) 统一初始化

在C++11之前,初始化的类型并非总是统一的. 例如以下两个man定义,一个作为结构,一个作为类.两者的初始化是不一样的. #include <iostream> using namespace std; struct manStruct{ string name; int age; }; class manClass { private: string name; int age; public: manClass(string s,int a):name(s),age(a){ } }; i

[cocos2d-x] 一些C++ 11新特性的引入

1.auto关键字的使用 auto关键字原理     在定义变量的时候必须申明类型,c++是强语言类型,在编译阶段需要知道类型,这样的好处是程序效率更高,而动态语言不需要类型申明的需要自推导变量类型.使用了auto是不是c++效率会变慢?完全不是,因为在编译阶段编译器已经帮程序员推导好了变量的类型.前提条件是编译器可以根据当前的程序的状态推导出变量类型.只是编译器更加智能,可能会增加编译工作,但是不会影响运行效率. 实例1:申明普通变量 auto num = 10; 实例2: vector<st

c++11 新特性之 auto关键字

C++11是对目前C++语言的扩展和修正.C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decltype,和模板的大量改进. g++编译c++11命令加上 -std=c++11 C++11中引入auto第一种作用是为了自动类型推导 auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以简化我们的编程工作 auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响另外,似乎auto并不会影响编译速度,