此程序是我用来学习、测试并体验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 生成】
在C++98版本中,动态数组的初始化方式是通过构造函数进行,而不能使用列表初始化(例如{3, 7, 2, 5, 5, 6, 8}
)。因此,在C++98编译器下,对于vector<int> a = {3, 7, 2, 5, 5, 6, 8};
这一行代码进行编译时,编译器会报错,提醒使用构造函数进行初始化。
要解决这个问题,可以使用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}
。
在竞赛只支持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中,不支持使用花括号初始化数组