试图在 C++ 中创建一个包含结构的数组?

Posted

技术标签:

【中文标题】试图在 C++ 中创建一个包含结构的数组?【英文标题】:Trying to Create an array holding a Struct in C++? 【发布时间】:2021-08-05 03:17:07 【问题描述】:

我正在尝试使用 c++ 中的结构创建一个数组,该结构需要两个变量,即值和权重。所以我创建了一个数组,它在这样的一个元素中具有值和权重 Arr[]=1,2,3,4...如果我打电话,我想要那个 Arr[0].value 和 Arr[0].weight 那么它应该分别返回 1 和 2 但我认为我做错了,因为我遇到了很多错误

    //Heres my Item struct....
    
    struct Item
    
        int value, weight;
        // Constructor
        Item(int value, int weight)
        
            this->value = value;
            this->weight = weight;
        
    ;



    //This is my knapsack function

    double knap(int n, Item arr[], double w)
    
        double v = 0;
        double am = 0;
        for (int i = 0; i < n; ++i)
        
            if (w == 0)
            
                return v;
            
            am = min(arr[i].weight, w);
            v += am * (arr[i].value / arr[i].weight);
            w -= am;
        

        return v;
    

    //Heres my main() function

    int main()
    
        int n;
        double w;
        cin >> n >> w;

        struct Item arr[n];


        for (int i = 0; i < n; ++i)
        
            cin >> arr[i].value >> arr[i].weight;
        
        //this is a fuction i want to run
        cout << knap(w, arr[], n);
    

这里是错误

  /storage/emulated/0/coursera/max money2.cpp:50:14: 
   errorr: no matching constructor for initialization of 
   'structt Item [n]'
        struct Item arr[n];
                    ^
    /storage/emulated/0/coursera/max money2.cpp:7:9: note: 
    candidatee constructor (the implicit copy constructor) 
   not viable: requires 1 argument, but 0 were provided
        struct Item
               ^
    /storage/emulated/0/coursera/max money2.cpp:7:9: note: 
   candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 0 were provided
/storage/emulated/0/coursera/max money2.cpp:11:3: note: candidate constructor not viable: requires 2 arguments, but 0 were provided
                Item(int value, int weight)
                ^
    2 errors generated.

【问题讨论】:

struct Item arr[n]; -- 这不是有效的 C++。数组的大小必须由常量而不是运行时值表示。其次,这里不需要struct——代码看起来更像C,而不是C++。而是:std::vector&lt;Item&gt; arr(n);. 您遇到了什么错误?什么是knap() 签名?请编辑您的问题以包含minimal reproducible example 我已经编辑了我的帖子并添加了错误图像以及 knap() 函数@Slava 顺便说一句,knap() 期望 int 作为第一个参数,double 作为最后一个参数,但您使用 doubleint 调用它。并且您的错误不可见,请将它们作为文本发布 您希望struct Item arr[n]; 行完成什么?构造n 类型为Item 的对象?没有构造参数如何构造它们? (这就是错误消息的意思。) 【参考方案1】:

您最大的编译问题是:

你必须给你的Item 一个默认构造函数,否则,它不能存在于未初始化的数组中。

struct Item

    int value, weight;
    // Constructor
    Item(int value, int weight)
    
        this->value = value;
        this->weight = weight;
    

    Item() : value(0), weight(0)
    ;
;

当你像这样调用 knap 时,你的参数似乎被颠倒了。此外,您传递不带括号的数组:

    cout << knap(w, arr[], n);

你的意思可能是:

    cout << knap(n, arr, w);

正如其他人指出的那样:

    struct Item arr[n];

这不是有效的 C++,但 g++ 允许。

更好:

    std::vector<Item> arr;    // #include <vector>
    arr.resize(n);

然后你将它作为指针传递给你的 knap 函数(它是这样写的:

cout << knap(n, arr.data(), w);

或者,修改您的 knap 函数以获取向量:

double knap(vector<Item>& arr, double w)

    int n = arr.size();

所以你可以说:

cout << knap(arr, w);

【讨论】:

以上是关于试图在 C++ 中创建一个包含结构的数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中创建一个包含数组但不使用堆的结构?

在 C++ 中的类中创建类对象的动态数组

我必须在 C 中创建一个带有指向数组的结构数组

无法在 C++ 中创建结构向量

如何在 C++ 类中创建 const 数组和计算 const 值?

从巨大的二维结构数组中创建结构的子数组