逐个使用C++11新特性
C++11
auto & decltype
auto:根据变量初始值来推导变量类型,并用右值初始化变量。

int main()
{
map<string, vector<string>> family;
family.insert(pair<string, vector<string>>("陈", {"澄", "尘"}));
family.insert(pair<string, vector<string>>("朱", {"珠", "茱"}));
for(const auto &mp : family)
{
cout << mp.first << endl;
for(const auto &str : mp.second)
cout << str << " ";
cout << endl;
}
return ;
}

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

这里要注意下:decltype(i)--是i的类型,而decltype((i))就是引用了。就像上面例子中的x 就是int &x;
右值引用
新标准在拷贝构造函数、拷贝赋值运算符和析构函数之外,还增加了移动构造函数和移动赋值运算符,而这二位就需要右值引用的支持。
1. 延长将亡值的生命。
//右值引用
int a = ;
int &b = a;
int &&bb = ;//右值引用只能绑定将亡值
//int &&bb = a;//错,a是左值(持久值)
a = std::move(bb);//右值引用移动 cout << "引用:" << b << endl;
cout << "右值引用:" << bb << endl;
cout << "移动: " << a << endl;
&&bb = 999;//错,类似左值引用,不可二次赋值
&b = 888;//错

我们居然输出了89,要知道,右值只是临时量,用完就扔的。
2. 用于移动(构造)函数
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; class test
{
public:
test();
~test();
void push(const int& i);
void push(int&& i)
{
bar = std::move(i);//std::move(右值引用)实现移动
}
private:
int bar;
}; int main()
{
int a = ;
test t;
t.push();
//t.push(a);错误无法将右值绑定到左值 return ;
}
范围for循环
统计字符
string str = "No pain, no gain! Everyone need to struggle for himself.";
decltype(str.length()) count = , count1 =;
for (auto i : str)
if (ispunct(i))
++count;
else
++count1;
cout << "字符串长度:" << str.size() << endl;
cout << "标点字符的个数:" << count << endl;
cout << "其他字符的个数:" << count1 << endl;
改写字符
#include <iostream>
#include <string>
using namespace std; int main()
{
string str("No pain, no gain! Everyone need to struggle for himself.");
cout << str << endl; for (auto &c : str)
c = toupper(c);//小写换大写 cout << str << endl;;
return ;
}

去除字符
//去除标点 1
#include <iostream>
#include <string>
using namespace std; int main()
{
string input, res = "";
while (cin >> input)
{
for (auto c : input)
if (!ispunct(c))
res += c;
cout << res << endl;
res = "";
}
}
智能指针
std::weak_ptr & std::shared_ptr
lambda表达式·λ
先看它怎么用
例1
//惯用法
//[捕获外部变量](参数列表)->返回类型{ 函数体(别忘记";")}
auto str = "I want you!";
auto f = [](string str)->int { return str.size(); };
cout << f(str) << endl; int m = ;
//捕获参数---值捕获
auto getValue = [m] {cout << m << endl; };
getValue();
//捕获参数---引用捕获
auto getValue1 = [&m] {cout << m << endl; };
getValue1(); //捕获参数---隐式值捕获
auto getValue2 = [=] {cout << m << endl; };
getValue2(); //捕获参数---隐式引用捕获
auto getValue3 = [&] {
cout << m << endl;
cout << "修改:" << ++m << endl;
};
getValue3(); int num[] = { , , , , };
sort(num, num + , [](const int a, const int b) ->bool {return a > b; }); for (auto i : num)
cout << i << " ";

例子补充:
int main()
{
//lambda表达式
//1.标准写法[捕获函数内局部变量列表] (传入参数列表) ->return type {function body;} ;
auto fc = []()->int {
return ;
};
cout << "1.标准写法\n" << fc() << endl; //2.带传参数
auto f = [](int a, int b) {
return a + b;
};
cout << "2.带传参数\n" << f(, ) << endl; //3.捕获变量值
int param = ;
auto ff = [param](int b){
return param + b;
};
cout << "3.捕获变量值\n" << ff() << endl; //4.捕获变量引用
int param2 = ;
auto ff2 = [¶m2](int b){
param2 += ;
return param2 + b;
};
cout << "4.捕获变量引用\n" <<ff2() << endl;
cout << param2 << endl; //4.当作算法函数谓词,例修改sort排序降序
vector<int> vec = {, , , , , };
sort(vec.begin(), vec.end(), [](int a, int b){ return a > b;});
for(auto i : vec)
cout << i << " "; //隐式引用捕获:即默认局部变量都是引用类型,可以在λ体内修改,也可以在参数捕获列表中指定某些参数只是值捕获,否则全部默认引用捕获
string str = "lambda";
string str2 = " is good candy!";
auto addStr = [&]{
str = "lambda really";
return str + str2;
};
cout << addStr() << " " << str << endl;
return ;
}

它的优势在哪里?又或者说为什么要用它呢?
再看一个例子
例2
//多线程
for (int i = ; i < ; ++i)
{
std::thread t([i] { cout << i << endl; });//<thread>
t.detach();
}
从上面的多个例子看来,我们可以很方便的实现“函数内的函数定义和使用”,即函数嵌套【例1】,这样一来就不用再在外部定义函数,然后才能使用【例2】。甚至,它连函数名都可以不要,就像上面的sort函数中的用法一样。极大的简化了我们的代码,可读性也增强了许多,不用再回到定义处推敲了。
逐个使用C++11新特性的更多相关文章
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- C++11新特性总结 (二)
1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...
- C++11新特性总结 (一)
1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...
- C++ 11 新特性
C++11新特性: 1.auto 2.nullptr 3.for 4.lambda表达式 5.override ...
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- C++11新特性——range for
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中.range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作. 1.基本语法 for(d ...
- C++11新特性——大括号初始化
C++11之前,C++主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello" ...
- C++11新特性之六——元编程
C++11新特性之六——元编程
随机推荐
- .NET Core中使用AutoMapper
何为AutoMapper AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 安装AutoMapper 这里我们在NuGet中下载安装Au ...
- DateTime Tips
DateTime Tips(System.Runtime Version=4.2.1.0) 抛砖引玉,如有错误或是更好的方式还望不吝赐教 1. 根据某个DateTime对象取其当天的起始时间例如:输入 ...
- PostgreSQL(PostGIS)安装和入门的若干问题
1. 装完PostgreSQL后记得打开pgAdmin4启动一下服务器和启动一下数据库,否则PostGIS装不上. 2. pgAdmin4是网页,而3是客户端,当然都可以在File - Prefere ...
- Windows Server 2012 R2 安装密钥(只适用安装,不支持激活)
标准版 = NB4WH-BBBYV-3MPPC-9RCMV-46XCB 数据中心版 = BH9T4-4N7CW-67J3M-64J36-WW98Y
- 使用PowerShell实时查看日志文件的变化
开发过程中,会有好多的日志输出到日志文件中了,每次看日志都需要打开,log文件,觉得麻烦 找了个省事的方法 使用PowerShell 使用命令:Get-Content D:\www\webapp1\L ...
- 3星|《绩效使能:超越OKR》:较全较新资料汇编,华为实施经验少
全书是关于绩效管理与OKR的比较新比较全的资料汇编.从泰勒的科学管理说起,一直到现代的KPI.最近的OKR.梳理了工业革命以来重要的绩效管理思想的具体方法.适应情况,详细讲OKR的来龙去脉.适应情况. ...
- 【死磕 Spring】----- IOC 之 Spring 统一资源加载策略
原文出自:http://cmsblogs.com 在学 Java SE 的时候我们学习了一个标准类 java.net.URL,该类在 Java SE 中的定位为统一资源定位器(Uniform Reso ...
- 如何让 Editplus 支持 SQL 语法高亮
editplus 用来编辑或查看一些常用程序源码都很方便,而且软件小巧,但是他原生不能支持对 SQL 文件的高亮显示,有点遗憾,但好在我们可以自定义这种高亮显示,那么要如何设置呢 1. 首先点击下载文 ...
- #Java学习之路——基础阶段二(第三篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- 阿里云服务器建站——centos7部署apache+mysql+php
自己也是忙活了半天,才完成了阿里云服务器的建站,这里就来分享一下. 首先如果是要自己搭建一个网站的话,除了服务器以外还要购买域名,并且要去备案,一般在哪买的域名都有备案的系统,备案的话一般要两到三个星 ...