请问为什么这样定义动态数组时c++98会报错而将其改为c++11就不会了呢

此程序是我用来学习、测试并体验sort的不同用法的排序功能而写的。但在运行的时候c++98版本的编译器却对数组定义进行了报错
报错信息:(1)4 30 C:\Users\Windows10\Desktop\一本通答案\未命名21.cpp [Error] in C++98 'a' must be initialized by constructor, not by '{...}'
(2)4 30 C:\Users\Windows10\Desktop\一本通答案\未命名21.cpp [Error] could not convert '{3, 7, 2, 5, 5, 6, 8}' from '' to 'std::vector'
将编译器选项改为c+11之后程序就能够正确运行了。想请教下:
1.出现此情况的原因。
2.以后遇到这样的情况该怎么办呢?
3.听说目前大部分竞赛时是只支持c++98的,在此情况下该如何处理呢?
代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
    vector<int>a= {3,7,2,5,5,6,8};//这一行报错
    sort(a.begin(),a.begin()+8,greater_equal<int>());
    for(int i=0;i<a.size();i++)cout<<a[i]<<" "<<i<<endl;
    
    return 0;
} 

正确运行结果:
8 0
7 1
6 2
5 3
5 4
3 5
2 6
期盼着您的解答

【以下回答由 GPT 生成】

问题分析和解答

  1. 为什么会出现这种情况?C++98版本的编译器为什么会报错?

在C++98版本中,动态数组的初始化方式是通过构造函数进行,而不能使用列表初始化(例如{3, 7, 2, 5, 5, 6, 8})。因此,在C++98编译器下,对于vector<int> a = {3, 7, 2, 5, 5, 6, 8};这一行代码进行编译时,编译器会报错,提醒使用构造函数进行初始化。

  1. 遇到类似的问题应该如何解决?为什么将编译器选项改为C++11后问题就解决了?

要解决这个问题,可以使用C++98版本兼容的数组初始化方式进行初始化。可以通过以下两种方式解决:

方式一:使用push_back()函数一个一个添加元素到vector中:

vector<int> a;
a.push_back(3);
a.push_back(7);
a.push_back(2);
a.push_back(5);
a.push_back(5);
a.push_back(6);
a.push_back(8);

方式二:通过构造函数进行初始化:

int arr[] = {3, 7, 2, 5, 5, 6, 8};
vector<int> a(arr, arr + sizeof(arr) / sizeof(int));

将编译器选项改为C++11后,问题得以解决的原因是,C++11引入了列表初始化(brace initialization)的特性,允许使用列表初始化的方式初始化容器或数组,例如{3, 7, 2, 5, 5, 6, 8}

  1. 我听说大部分竞赛只支持C++98的版本,那么在这种情况下应该如何处理这个问题?

在竞赛只支持C++98版本的情况下,可以采用方式一(使用push_back()函数一个一个添加元素到vector中)进行数组的初始化。

以下是修改后的代码示例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    vector<int> a;
    a.push_back(3);
    a.push_back(7);
    a.push_back(2);
    a.push_back(5);
    a.push_back(5);
    a.push_back(6);
    a.push_back(8);

    sort(a.begin(), a.begin() + 8, greater_equal<int>());
    for(int i = 0; i < a.size(); i++) {
        cout << a[i] << " " << i << endl;
    }

    return 0;
}

运行结果为:

8 0
7 1
6 2
5 3
5 4
3 5
2 6

请注意,修改后的代码在C++11及以上版本依然可以正常运行。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

在C++98中,不支持使用花括号初始化数组