【问题标题】:How do I solve the "array initializer must be an initializer list" error?如何解决“数组初始值设定项必须是初始值设定项列表”错误?
【发布时间】:2021-10-29 10:25:06
【问题描述】:

我为算法问题写了一个问题。我是 C++ 新手,当我尝试运行我的代码时收到以下错误消息:“数组初始化程序必须是初始化程序列表”。这是代码本身:

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

int main(){
    int n;
    cin>>n;
    int a[n][2];
    int b[n];

    for(int i=0;i<n;i++){
        cin>>a[i][0];a[i][1]=i;
        b[i]=a[i][0];
    }

    sort(a,a+n);

    for(int i=1;i<n;i++)
    {
        if(a[i][0]<=a[i-1][0]){
            a[i][0]=a[i-1][i]+1;
            b[i]=a[i-1][i]+1;
        }
    }

    for(int i=0;i<n;i++)
        cout<<b[i]<<" ";

}

我不知道为什么会收到此错误消息。我用谷歌搜索了它,找不到任何有用的东西。如果有人可以向我解释为什么我会收到此消息以及如何解决它,我将不胜感激。提前致谢。

【问题讨论】:

  • std::array 与排序函子一起使用。
  • 报错在哪一行?可变长度数组,例如int a[n][2]; 是编译器扩展,可能不适用于您使用的编译器。看看这里 - 直播 - godbolt.org/z/vePbT5GMT
  • C++ stackoverflow.com/questions/39334435/… 中不允许使用 VLA,这可能是问题所在(尽管错误消息似乎有点奇怪)
  • 对于那些想知道的人,触发错误的是sort(a,a+n); 行。因为你怎么知道int[2] 是否在另一个int[2] 之前排序?
  • 错误消息(我可以重现)来自这个排序调用:sort(a,a+n); 看起来库函数很难从指针算术初始化迭代器。

标签: c++ arrays sorting


【解决方案1】:
cin>>n;
int a[n][2];

数组变量的大小必须是编译时常数。 n 不是编译时间常数。程序格式不正确。

我有什么选择?

如果您想要一个运行时大小的数组,那么您必须在动态存储中创建该数组。最简单的方法是使用std::vector。 vector 的元素不能是数组,但可以使用std::array 作为元素类型。示例:

std::vector<std::array<int, 2>> a;
sort(a,a+n);

a 是一个数组数组。 tha 数组的元素本身就是数组。参数衰减为指向数组的指针。指向数组的指针不满足std::sort 要求的“值可交换”的要求。 std::array 的迭代器是“值可交换的”,所以这个问题可以通过使用上面建议的内部数组来解决。

【讨论】:

    【解决方案2】:

    如果你想创建一个数组,大小必须是常数或者你应该使用vector代替。此外,编译器说你必须用花括号将你的数组分配给 0:

    int a[5][2]={{0}};
    int b[5]={0};
    

    【讨论】:

    • 我一直想知道人们为什么写int b[5] = {0};。这意味着:使用0 初始化第一个元素,并默认初始化其余元素。为什么第一个元素如此特殊以至于值得显式零初始化?..
    • 不,将数组分配给 {0} 会使所有元素为 0
    • int b[5] = {1}; 会做什么?
    • 它将第一个元素赋值为 1,其他元素赋值为 0
    • 这就是我问的原因——为什么第一个元素如此特别以至于它需要一个 0 初始化器,而其余的则不需要? ;) 也就是说,为什么不int b[5] = {};int b[5]{};
    猜你喜欢
    • 2019-04-16
    • 2020-07-31
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多