分类
标签
Bash C/C++ CI/CD CMU Cookie CS231n CS50 CSS CTF Diffie-Hellman Emmet Floyd算法 FPGA GitHub Actions Github Pages golang GOT表 Hexo HTML HTTP Java JavaScript Jupyter LeetCode Linux logrus MIT Missing Semester NumPy OpenSSL PLT表 Python RSA Session Shell sing-box socket SQL SQLite SQL注入 SVD SymPy TCP/IP Verilog Web开发 writeup XPath ZJU校巴 主定理 代理 信息安全 内存 前端 动态规划 动态链接 博客 压缩 参考 后端 命令行 国际交流 图像处理 图解 堆 堆排序 复杂度分析 密码学 开发 归并排序 微积分 心得 快速排序 抽象代数 搜索 操作系统 数字电路 数字逻辑 数学 数据库 数据结构 数论 文件系统 时间戳 有限状态自动机 机器学习 正则表达式 汇编 游戏开发 爬虫 物理 环境配置 科学计算 竞赛 笔记 算法 线性代数 编程语言 编译 网络 网络安全 背包DP 计算机基础 计算机视觉 计算机网络 课程 课程推荐 谱定理 踩坑 逆向 逆向工程 逻辑电路 非对称加密 题解 高斯消元法 魔塔
683 字
3 分钟
C++11方便又常用的特性
不会吧,C++20都出了,不会还有人在学C++11的新特性吧(就是我)。这篇文章介绍一些C++11的方便的语法糖/特性。
auto类型推导
这可以说是C++11中最方便最常用的特性了,一旦开始用就再也回不去了。
float foo();
auto a = 3; // a的类型是int
auto b = foo(); // b的类型是float
auto c; // 报错,因为编译器无法推断出c的类型
这个特性在遍历stl容器的时候很好用,例:
std::vector<int> array;
// 传统的方法很长很麻烦
for(std::vector<int>::iterator it = array.begin(); it != array.end(); ++it){
// do something
}
// 现在只需这样
for(auto it = array.begin(); it != array.end(); ++it){
// do something
}
要注意auto
可以用于函数返回值但不能用于函数参数
auto foo(int a
- int b){
return a+b; // 则auto会自动推导为int
}
int bar(auto a, auto b); // 报错,因为编译器无法自动推导出a、b的类型,如果有这种需求就使用template吧
范围for循环
范围for循环又比上面提到的遍历容器的方式更简单了,上代码:
for(int i : a){} // a可以是int[]、vector<int>、queue<double>等等,很灵活,甚至自己写的类只要定义了begin()、end()、++等函数也可以使用这个语法糖
for(int& i : a){} // 这样的话i是一个引用
for(auto& i : a){} // 结合上一个特性就有了究极偷懒的写法
lambda表达式
python里面的lambda表达式实在是好用,C++11里面也有lambda表达式,不过C++毕竟是静态语言,用起来还是没有python里面的灵活。 格式:
[捕获列表] (函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
其中,捕获列表有:
- [] 表示不捕获任何变量
- [=] 表示按值传递的方法捕获父作用域的所有变量
- [&] 表示按引用传递的方法捕获父作用域的所有变量
- [=, &a] 表示按值传递的方法捕获父作用域的所有变量,但按引用传递的方法捕获变量a
- [&, a] 表示按引用传递的方法捕获父作用域的所有变量,但按值传递的方法捕获变量a
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
int main(){
// 例如要将下面的字符串从短到长排列
std::vector<std::string> a = {"Alpha", "Charlie", "Echo", "Juliet"};
std::sort(a.begin(), a.end(), [](auto &x, auto &y) auto {return x.length() < y.length();});
for(auto& str : a){
std::cout << str << std::endl;
}
/*
输出结果:
Echo
Alpha
Juliet
Charlie
*/
return 0;
}
nullptr
C++11提供了nullptr
关键字来代替以前的NULL
。NULL
的宏定义是#define NULL ((void *)0)
,在隐式类型转换的时候会出现二义性。nullptr
解决了这个问题,应该使用nullptr
而不是NULL
。