如何使用动态大小的结构数组?

Posted

技术标签:

【中文标题】如何使用动态大小的结构数组?【英文标题】:How to use a dynamically sized array of structs? 【发布时间】:2012-09-10 13:29:33 【问题描述】:

我必须做作业。它是一个控制台应用程序,它使用一组结构来保存有关计算机的信息(品牌、制造年份、重量和库存编号)。所以我写了一个完全可以工作的程序,但是我想用一个动态数组,因为我不知道用户会输入多少条记录。

有没有办法做到这一点。要在数组中添加新记录,直到用户说 n/N?有什么建议吗?

这是我的程序版本:

#include "stdafx.h"
#include <iostream>

using namespace std;

struct ComputerInfo

    char computerMark[20], invertarNumber[6];
    unsigned int year;
    float weight;
;

ComputerInfo computerArray[300];

ComputerInfo AddComputers(ComputerInfo compterArray[], int counter)

    cout << "Enter mark of the computer: ";
    cin >> computerArray[counter].computerMark;

    cout << "Enter year of establish: ";
    cin>> computerArray[counter].year;

    while ((computerArray[counter].year < 1973)
        || (computerArray[counter].year > 2013))
    
        cout << "INVALID YEAR!!!" << endl;

        cout << "Enter year of establish: ";
        cin>> computerArray[counter].year;
    

    cout << "Enter computer weidth: ";
    cin >> computerArray[counter].weight;

    cout << "Enter computer invertar number(up to six digits): ";
    cin >> computerArray[counter].invertarNumber;

    return computerArray[counter];


void ShowRecords()

    int counter = 0;

    while (computerArray[counter].year != 0)
    
        cout << "Mark: " << computerArray[counter].computerMark << endl;
        cout << "Year: " << computerArray[counter].year << endl;
        cout << "Weidth: " << computerArray[counter].weight << endl;
        cout << "Inv. number: " << computerArray[counter].invertarNumber << endl << endl;

        counter++;
    


void MoreThanTenYearsOld(ComputerInfo computerArray[])

    int counter = 0;
    float counterOldComputers = 0;
    float computerPer = 0;

    while (computerArray[counter].year == 0)
    
        if (computerArray[counter].year <= 2003)
        
            counterOldComputers++;
        

        counter++;
    

    computerPer = counterOldComputers / 3;

    cout << endl;
    cout << "Percantage of old computers is: " << computerPer << endl;


int main()

    int counter = 0;
    float computerPer = 0;
    char answer = 'y';

    for (int i = 0; i <= 299; i++)
    
        strcpy(computerArray[i].computerMark,"");
    

    while((answer == 'Y') || (answer == 'y'))
    
        computerArray[counter] = AddComputers(computerArray, counter);
        cout << endl;
        cout << "Do you want to enter more records (Y/N): ";
        cin >> answer;
        cout << endl;
        counter++;
    

    MoreThanTenYearsOld(computerArray);

    return 0;

【问题讨论】:

停止使用数组,开始使用std::vector 只是想知道:为什么是 1973..2013 范围? 【参考方案1】:

是的。而不是你的数组,使用

std::vector<ComputerInfo> computerArray;

您可以添加任意数量的对象:

ComputerInfo c;
// read the data
computerArray.push_back(c);

现在,computerArray[0] 将拥有c 中的信息。

您需要#include &lt;vector&gt;

此外,您可以使用std::string 代替char computerMark[20]

【讨论】:

并在vector 中使用std::string @honk 你的意思是在ComputerInfo里面? 是的,正是为了帮助自动生成的复制构造函数。但你知道的。 这个答案没有解决 OP 明确表示他正在做作业并且可能不允许使用 STL 类的事实。 @Code-Guru 问题中没有任何内容建议任何此类限制。在没有更多信息的情况下,我认为像这里所做的那样提供最佳解决方案是正确的方法。【参考方案2】:

你有两个选择:

1) 使用std::vector 而不是数组。这是一个非常强大的工具,当然值得学习如何使用。

2) 动态分配数组并在添加更多项目时调整其大小。基本上这意味着编写您自己的std::vector 版本。这是增强您的编程技能的好方法。您将了解编写标准类和函数的内容。但是,我建议在更严肃的编程中使用std::vector,因为它已经过彻底的测试和调试。

【讨论】:

以上是关于如何使用动态大小的结构数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建动态大小的结构数组?

如何删除结构的动态数组(C++)?

如何找出动态分配数组的大小(使用 sizeof())? [复制]

如何释放动态结构数组的内存

如何在 C 中找到动态分配数组的大小?

如何在 glTexImage2D 中使用动态大小的纹理数组?