2012-02-05 64 views
1

我真的需要一些帮助...我详细说明了我的问题,我需要一个特定类型的数组,但我不知道它的长度,然后从其他数组中检索值, 。事实上,我不想花时间再次通过几个循环,我不知道这样做的最佳方式。我应该使用一个堆栈和一个计数器,并在填充之后立即填充阵列?计数元素存储在一个数组

RelAttr *tab; 
//need to initialize it but how 
/*several for loops retrieving values*/ 
    tab[i] = value; 
/*end for loops*/ 

显然这段代码是不完整的,但它是如何做的东西。我知道我不能这样做的做作,而不必指定之前数组的长度......

感谢您的帮助

回答

4

只需使用一个std::vector

std::vector<RelAttr> vec; 

vec.push_back(a); 
vec.push_back(b); 
... 

它透明地管理自己的发展。每当它增长时,所有项目都被复制,但是这个摊销成本是O(1)。

的存储也保证是连续的,所以如果你真的需要一个原始的C风格的数组,那么你可以简单地这样做:

const RelAttr *p = &vec[0]; 

然而,你应该真的只有这样做,如果你有一个您需要满足的传统C API。

+0

好的,正是我所需要的,并且事实上它是连续的,它有助于......是的,我需要一个原始数组...因为这是一个需求。废话 – mvdb 2012-02-05 12:22:18

+0

@ getmax0不过要注意,在旧的C++标准中,似乎没有任何保证std :: vector将内容连续存储在内存中(例如,请参阅http://groups.google.com/group/)。 comp.lang.C++/msg/408d058c256d7699?pli = 1) – 2012-02-05 12:25:38

+0

@ getmax0此外,另一方面,该向量将拥有内存,所以不要让它超出范围,而需要使数组指针有效。 – 2012-02-05 12:32:26

1

由于这是C++,建议使用std::vectorstd::vector<RelAttr>),因为事先不需要知道对象的数量。您可以根据需要使用std::vector::push_back()添加新元素。

+0

因为我需要一个数组传递给一个函数到最后,这个转换将会在数组的最后“复制”到这个向量中? – mvdb 2012-02-05 12:17:13

+0

查看@OliCharlesworth的答案,他提供了一个解决方案。或者,你可以将'vector'复制到一个数组,但是效率很低。 – hmjd 2012-02-05 12:20:44

0

如果你不知道在编译时长,您可以使用

功能malloc,运营商newvector或其他类型的容器

0

最简单的方法(假设没有什么特别的表现是关键的)是使用一个std :: vector来组装这些值和(如果需要)将vertor转换为一个数组。就像是;

std::vector<RelAttr> vec; 
... 
vec.push_back(value); 
... 

并且如果你想在之后将它转换为数组;

RelAttr *tab = new RelAttr[vec.size()]; 
copy(vec.begin(), vec.end(), a);