【问题标题】:How to store an unknown number of elements in an array C++如何在数组C ++中存储未知数量的元素
【发布时间】:2011-08-05 19:07:18
【问题描述】:

对不起,如果标题不清楚,但我现在将解释我的问题。我是 C++ 新手。

我在 C++ 中创建了一个类。该类的实例是程序的输入,它们必须存储在数组中才能执行计算。问题是必须由用户定义的该类的实例数量对于单次运行是固定的,但可能因运行而异。举个例子:

#include <<blablah>blahblah>

int main()
{
int number_of_instances = 3;

MyClass first_instance(one_parameter_1, another_parameter_1);
MyClass second_instance(one_parameter_2, another_parameter_2);
MyClass third_instance(one_parameter_3, another_parameter_3);

/////////////////

现在我必须将所有三个存储在一个数组中

MyClass array[number_of_instances] = {first_instance, second_instance, third_instance};

问题是我事先不知道用户要输入多少个

/////////////////

performCalculations(array);
return 0;
}

非常感谢。

【问题讨论】:

  • ...或数组和变量计数器。
  • 使用std::vector,这个主题描述了一些优雅的方式来填充你的向量:Implementing Array Initializer

标签: c++ arrays dynamic store


【解决方案1】:

典型的 C++ 解决方案是使用vector。

vector<MyClass> v;
v.push_back(first_instance);  //add an already instantiated object to the end of the vector
v.push_back(second_instance);
v.push_back(third_instance);

您不必担心内存管理,并且可以像访问普通数组一样访问向量:

v[0].classMember

如果需要,您还可以在循环中将项目添加到向量中,如下所示:

for(int i = 0; i < 5; i++){
    v.push_back( MyClass(i, param2) );
}

如果您将对象直接存储在向量中,那么当向量超出范围时,所有对象都将被破坏。

将对象直接存储在向量中的缺点之一是将向量作为参数传递给函数。这将是一个缓慢的操作,因为必须复制向量(及其包含的所有对象)。

【讨论】:

  • 非常感谢大家。好的,我理解这个概念,但现在的问题是我是否不知道其中会有多少。如果我不知道要添加多少 v.push_back(number_instance) 实例,如何添加更多实例。
  • @Altober - 是的,你可以继续调用 push_back 函数来添加更多元素
  • @DShook 非常感谢。抱歉,我可能非常愚蠢,但我知道我可以编写一个 for 循环来继续调用 push_back,但是如何在 for 循环的不同迭代中更改实例的名称,如 first_instance、second_instance、third_instance 等。
  • @Altober - 检查我的编辑。请记住,我现在不在编译器中,所以请注意错误
  • @DShook:向量参数仅在通过副本传递时才会被复制。如果它通过引用或指针传递,则不进行复制。即使是通过复制传递,编译器的优化器也可能会注意到它在函数中没有被修改,并且会省略复制。
【解决方案2】:

如果您不知道数组将包含多少个元素,我会使用 std::vector 而不是普通数组,因为向量会增长以容纳额外的元素。

【讨论】:

    【解决方案3】:

    您想要的是标准模板库中的Vector 类,它的行为类似于一个数组,但如果您填充它的内部分配,它会重新调整大小。如果您不需要随机访问它(即使用 [] 运算符),您可能需要改用 List 类。如果您使用 List,则需要创建一个枚举器来单步执行它。

    【讨论】:

      【解决方案4】:

      使用std::vector&lt;MyClass&gt;,vector模板可以在&lt;vector&gt; header中找到。在编码之前,您必须学习一点才能很好地编码,然后使用任何在线可用的 c++ 常见问题解答

      【讨论】:

        【解决方案5】:

        在这种情况下你应该使用 std::vector 而不是内置数组。

        #include <vector>
        ...
        std::vector<MyClass> v = {first_instance, second_instance, third_instance};
        ...
        v.push_back(fourth_instance);
        

        【讨论】:

          【解决方案6】:

          如果您在全部读取之前知道实例的数量,那么您可以使用new[] 在堆上分配一个数组。 (完成后不要忘记delete[]他们。)请注意,这要求对象具有默认构造函数。

          【讨论】:

          • 对不起,尼尔,你读完它们是什么意思?感谢您的回答。
          • 您说它们是程序的输入,所以我假设它们需要以某种方式读取,并且您可能提前知道需要输入多少。
          猜你喜欢
          • 2023-01-25
          • 2021-11-26
          • 2020-04-29
          • 1970-01-01
          • 2019-08-16
          • 2012-11-19
          • 2013-04-25
          • 2020-02-20
          • 1970-01-01
          相关资源
          最近更新 更多