2011-04-14 206 views
1

很抱歉,如果标题是不明确的,但现在我会解释我的问题。我是C++新手。如何存储未知数量的元素数组中的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); 

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

现在我已经来存储所有三种阵列中的LIKE

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

的问题是,我不知道前手有多少人是在用户即将输入

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

performCalculations(array); 
return 0; 
} 

非常感谢。

+0

使用链表? – Ross 2011-04-14 18:43:00

+1

...或数组和可变计数器。 – Ross 2011-04-14 18:44:04

+0

使用'std :: vector',本主题描述了几种优雅的方式来填充你的矢量:[实现数组初始化](http://stackoverflow.com/questions/5395595/implementing-array-initializer) – Nawaz 2011-04-14 18:49:03

回答

6

典型的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)); 
} 

而且所有的对象都将被破坏:如果需要的话,像这样。

其中一个缺点直接在矢量存储的对象的经过所述向量作为参数的函数。这将是一个缓慢的操作,因为矢量(及其所有对象)将不得不被复制。

+0

非常感谢你们。好吧,我理解这个概念,但现在的问题是,如果我不知道其中会有多少人。如果我不知道其中会有多少实例,我如何添加更多v.push_back实例(number_instance)。 – Altober 2011-04-14 18:50:58

+0

@Altober - 是的,你可以继续调用push_back函数来添加更多元素 – DShook 2011-04-14 18:52:58

+0

@DShook非常感谢。对不起,可能我太可怕了,但我明白我可以编写一个for循环来继续调用push_back,但是如何在for循环的不同迭代中将实例名称更改为first_instance,second_instance,third_instance等。 – Altober 2011-04-14 18:57:27

0

如果你不知道数组有多少元素包含,我会用一个std::vector而不是一个普通数组作为载体将增长以容纳更多的元素。

0

你需要的是从标准模板库中的Vector类,它像一个数组,但它会重新本身的大小,如果你填补它的内部分配。如果您不需要随机访问它(即使用[] opperator),您可能需要使用List类。如果你使用List,你将需要创建一个枚举器来遍历它。

0

使用std::vector<MyClass>,vector模板可以在<vector>标题中找到。你必须学会​​一点点的代码好,编码使用任何网络的可用的C++常见问题

1

你应该在这种情况下,使用std :: vector而不是内置阵列之前。

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

这不会在C++ 03中起作用。 – Nawaz 2011-04-14 19:00:44

2

如果您知道实例数您在阅读它们,那么你可以分配使用new[]堆阵列之前。 (完成后别忘了delete[])。注意这需要对象具有默认的构造函数。

+0

对不起尼尔你是什么意思阅读他们?感谢你的回答。 – Altober 2011-04-14 19:02:14

+0

你说他们是程序的输入,所以我假设他们需要以某种方式阅读,并且你可能事先知道你需要输入多少。 – Neil 2011-04-14 19:05:54

相关问题