int * a;
a = new int[10];
cout << sizeof(a)/sizeof(int);
如果我使用普通数组,答案将 10 , 唉,印刷的幸运数字是 1 ,因为sizeof(int)是4而iszeof(* int)也是4。我怎么能这个?在我看来,保持内存大小是一个复杂的选择。如何使用代码获得大小?
我最好的猜测是迭代一个数组并搜索它的结尾,结束是0,对吗?有什么建议吗?
- 修改
好吧,我对矢量的担心是它会在推回时重新分配,你得到了重点,我可以分配内存。但是,我无法改变结构,整个代码是相关的。谢谢你的答案,我看到没有办法,所以生病只是寻找一种方法来存储大小的内存。我问的问题不是什么样的结构。
答案 0 :(得分:7)
简单。
使用std::vector<int>
或std::array<int, N>
(其中N
是编译时常量)。
如果您在编译时知道数组的大小,并且不需要在运行时增长,那么使用std::array
。否则使用std::vector
。
这些被称为 sequence-container 类,它们定义了一个名为size()
的成员函数,它返回容器中元素的数量。只要您需要知道尺寸,就可以使用它。 : - )
阅读文档:
当您使用std::vector
时,如果您对容器要容纳的元素数量有一些模糊的概念,则应考虑使用reserve()
。这将为您带来性能优势。
如果您担心std::vector
vs 原始数据的效果,请在此处阅读接受的答案:
它解释了为什么问题中的代码很慢,与std::vector
本身没有,而不是错误的用法。
如果你不能使用其中任何一个,并被迫使用int*
,那么我会建议这两个选择。选择适合您需要的任何东西。
struct array
{
int *elements; //elements
size_t size; //number of elements
};
这是不言自明的。
第二个是:为一个更多元素分配内存并将大小存储在第一个元素中:
int N = howManyElements();
int *array = int new[N+1]; //allocate memory for size storage also!
array[0] = N; //store N in the first element!
//your code : iterate i=1 to i<=N
//must delete it once done
delete []array;
答案 1 :(得分:2)
sizeof(a)
将是指针的大小,而不是分配的数组的大小。
分配后无法获得数组的大小。必须能够在编译时对sizeof
运算符进行求值。
编译器如何知道该函数中数组的大小?
void foo(int size)
{
int * a;
a = new int[size];
cout << sizeof(a)/sizeof(int);
delete[] a;
}
它不能。因此sizeof
运算符不可能返回已分配数组的大小。而且,事实上,没有可靠的方法来获得您使用new
分配的数组的大小。让我重复一遍没有可靠的方法来获取您使用new
分配的数组的大小。你必须在某个地方存放大小。
幸运的是,这个问题已经为您解决了,并且保证在任何C ++实现中都存在。如果你想要一个很好的数组来存储大小和数组,请使用::std::vector
。特别是如果您使用new
分配数组。
#include <vector>
void foo(int size)
{
::std::vector<int> a(size);
cout << a.size();
}
你去吧。请注意您不再需要记住删除它。另外请注意,以这种方式使用::std::vector
与使用new
的方式相比没有任何性能损失。
答案 2 :(得分:0)
如果你不能像你所说的那样使用std :: vector和std :: array,那么你唯一的重新选择就是自己跟踪数组的大小。
我仍然怀疑你避免使用std :: vector的原因是错误的。即使对于性能监控软件,矢量的智能使用也是合理的。如果您担心调整大小,可以预先将矢量预分配为相当大。