逐个使用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新特性之六——元编程
随机推荐
- Android版数据结构与算法(六):树与二叉树
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 之前的篇章主要讲解了数据结构中的线性结构,所谓线性结构就是数据与数据之间是一对一的关系,接下来我们就要进入非线性结构的世界了,主要是树与图,好了接 ...
- 结合JDK源码看设计模式——装饰者模式
定义 在不改变原有对象的基础之上,将功能附加到对象上 适用场景 扩展一个类的功能 动态的给对象增加功能,当功能不需要的时候能够动态删除 详解 在看到定义的时候,可能很多人会想,这不就是继承吗?的确很像 ...
- mt8665芯片怎么样?联发科mt8665芯片参数介绍
MediaTek的MT8665是一款高度集成的LTE片上系统(SoC),它包含了先进的功能,例如LTE cat.4.Octa HMP核心在1.5GHz下工作.3D图形(OpenGLES 3.0).13 ...
- Android调试神器stetho使用详解和改造
本文由云+社区发表 作者:NaOH 概述 stetho是Facebook开源的一个Android调试工具,项目地址:facebook/stetho 通过Stetho,开发者可以使用chrome的ins ...
- Windows API编程(SDK编程)配置VS2017——出现LNK 2019错误的win32项目如何解决
最近刚入门SDK编程,在 我终于知道为什么windowsApi学的人这么少了 这篇文章中,确实发现了这样的问题,我的教程使用VS2013->Windows桌面->win32,就诞生了能使用 ...
- Redux进阶(一)
State的不可变化带来的麻烦 在用Redux处理深度复杂的数据时会有一些麻烦.由于js的特性,我们知道当对一个对象进行复制时实际上是复制它的引用,除非你对这个对象进行深度复制.Redux要求你每次你 ...
- 【STM32H7教程】第3章 STM32H7整体把控
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第3章 STM32H7整体把控 初学STM32H7一 ...
- 【STM32H7教程】第2章 STM32H7的开发环境搭建
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第2章 STM32H7的开发环境搭建 本章主要为大 ...
- webpack4打包nodejs项目进阶版——多页应用模板
前段时间我写了个打包nodejs项目的文章,点击前往 但是,问题很多.因为之前的项目是个历史遗留项目,重构起来可能会爆炸,当时又比较急所以就写个的适用范围很小的webpack的打包方法. 最近稍微得空 ...
- 难以理解的AQS(上)
在一篇博客中,我们看了下CopyOnWriteArrayList的源码,不是很难,里面用到了一个可重入的排他锁: ReentrantLock,这东西看上去和Synchronized差不多,但是和Syn ...