初级启示者
众所周知,去年ccf发布了noilinux2.0,其中自带的编译器是gcc9,默认使用C++14标准(当然某些比赛仍然可能使用c++98标准)
以下是新版C++对OI可能有用/影响的东西:
1. gets()被废弃
在新版的C++标准中,gets已经被弃用。有的同学可能会问了:我在noilinux2.0中还能使用gets啊??那是因为编译器提供了强大的向下兼容功能,gets是被兼容的,而不是c++14标准规定可用的,如果某次比赛在编译时加了指令让编译器只认c++14标准(如去年合肥市赛),那么这个使用gets的代码瞬间CE0分。替代方案:cin.getline()
2. auto关键字
在C++11中添加了吃香的auto关键字,意思是自动推导数据类型,有了这个关键字,定义迭代器就可以直接使用 auto it = a.begin(),而不用写冗长的迭代器声明了
3. 范围for循环
在c++11中添加了基于范围的for循环,使遍历等操作更加方便,如遍历一个数组可以使用:
int a[] = {5, 3, 4, 1, 2};
for (auto i : a) {
cout << i << " ";
}
或遍历一个集合
for (auto i : {1, 1, 4, 5, 1, 4}) {
cout << i << " ";
}
4. 使用集合 初始化stl容器 或 max/min函数
以后3个数再也不用**的max(max(a,b),c)了,直接max({a, b, c, d, e, f, ......}),理论上可以支持到无限多个数
还可以使用如 list<int> a = {1, 1, 4, 5, 1, 4} 的方式初始化stl容器(string、vector、list等等)
5. array容器
将c/c++中的数组封装为一种容器,可以更方便的进行数组的初始化/复制等等功能。array与vector不同的是array长度不可变,但是效率比vector更高,使用例程:
#include <array>
#include <iostream>
using namespace std;
int main() {
array<int, 1005> a; //定义,int是数组类型,1005是数组长度
a.fill(0); //数组填充为0
a = {0, 1, 4, 5, 1, 4}; //数组赋值
a[0] = 1; //数组赋值
array<int, 1005> b;
b = a; //数组复制(再也不用**memcpy了)
for (int i : b) { //输出数组1005个数据
cout << i << " ";
}
cout << endl;
for (int i = 0; i < 6; i++) { //输出数组6个数据
cout << b[i] << " ";
}
return 0;
}
注意事项:
我们日常使用的devc++5.11完全支持c++11(需要在编译器配置里手动选择),但对c++14仅部分支持
如果需要使用全部的新功能,建议使用Codeblocks或其他支持的新版IDE(或者你直接开noilinux2.0也行)