问题标题: OI竞赛中有用的新版C++功能

2
0
已解决
薛乘志
薛乘志
初级启示者
初级启示者

众所周知,去年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也行)


0
0
万韧山
万韧山
初级天翼
初级天翼

新手表示根本看不懂qwq

0
我要回答