C++20编译失败?

P3397 地毯

Cysheper @ 2024-11-08 17:56:33

为什么用C++20会编译失败,用C++17就过了,有大佬懂吗?

C++20 失败

C++17 AC

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
vector<vector<int>> v(1010,vector<int>(1010,0));
void solve(){
    int n, m;
    cin >> n >> m;
    while(m--) {
        int x, y, a, b;
        cin >> x >> y >> a >> b;
        v[x][y]++;
        v[x][b + 1]--;
        v[a + 1][y]--;
        v[a + 1][b + 1]++;
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            v[i][j] += v[i - 1][j] + v[i][j - 1] - v[i - 1][j - 1];
            cout << v[i][j] << ' ';
        }
        cout << "\n";
    }
}
int main(){
    ios::sync_with_stdio(false); 
    cin.tie(0);
    cout.tie(0);
    solve();
    return 0;
}

by LionBlaze @ 2024-11-08 17:58:57

@Cysheper

vector<vector<int>> v(1010,vector<int>(1010,0));

把初始化放到 main 或者 solve 函数里试试?


by _WRYYY_ @ 2024-11-08 18:00:57

数组都定长了为什么不直接使用定长数组,真想用 STL 为什么不用 array


by robinyqc @ 2024-11-08 18:32:51

@Cysheper C++20 起 vector 构造函数变为 constexpr。

你的 vector 里面大小和内容给的都是常量,所以 vector 在编译期就会初始化。

接下来是我的推测:在洛谷的 g++ 版本,展开应该是在栈上进行的,而通常来说 1000 * 1000 的内容是超过默认栈空间的,所以爆栈内存了。

根据以上内容,你可以:

都是可以的。


by Cysheper @ 2024-11-08 18:33:00

@LionBlaze 解决了,谢谢


by LionBlaze @ 2024-11-08 18:34:04

@robinyqc 膜拜神犇!


by Cysheper @ 2024-11-08 18:36:12

@robinyqc 懂了,膜拜dalao,orz


by Cysheper @ 2024-11-08 19:14:55

@WRYYY 第一次听说array。。赶紧补上来。谢谢,dalao


|