0
int * a;
a = new int[10];
cout << sizeof(a)/sizeof(int);

如果我使用普通数组,答案将是10,唉,打印的幸运数字是1,因为 sizeof(int) 是 4 而 iszeof(*int) 也是 4 。我该如何克服?在我的情况下,将大小保存在内存中是一个复杂的选择。如何使用代码获取大小?

我最好的猜测是遍历一个数组并搜索它的结尾,结尾是 0,对吗?有什么建议么?

- 编辑

好吧,我对向量的担心是它会在推回时重新分配,你明白了,我可以分配内存。但是我不能改变结构,整个代码都是相关的。感谢您的回答,我看到没有办法,所以我只是寻找一种将大小存储在内存中的方法。

我问的不是使用什么样的结构。

4

3 回答 3

7

简单的。

使用std::vector<int>Or std::array<int, N>(其中N是编译时常量)。

如果您在编译时知道数组的大小,并且它不需要在运行时增长,那么使用std::array. 其他使用std::vector

这些被称为序列容器类,它定义了一个称为size()返回容器中元素数量的成员函数。您可以在需要知道大小时使用它。:-)

阅读文档:

使用 时,如果您对容器将容纳的元素数量有一些模糊的概念,std::vector则应考虑使用。reserve()这将为您带来性能优势。

如果您担心std::vectorvs raw-arrays的性能,请在此处阅读接受的答案:

它解释了为什么问题中的代码很慢,这与它本身无关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;
于 2013-01-18T21:32:43.630 回答
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您使用它的方式使用性能损失。

于 2013-01-18T21:32:33.160 回答
0

如果您无法使用您所说的 std::vector 和 std::array ,那么您唯一的选择就是自己跟踪数组的大小。

我仍然怀疑您避免使用 std::vector 的原因是错误的。即使对于性能监控软件,vector 的智能使用也是合理的。如果您担心调整大小,可以将向量预分配到相当大的大小。

于 2013-01-18T21:52:00.653 回答