动态数组的大小或循环通过它而不知道大小

时间:2015-04-24 12:56:43

标签: c++ dynamic-arrays

就像在标题中一样,我可以以某种方式获得动态分配数组的大小(我不能单独保存它),或以某种方式循环遍历此数组而不使用它的大小?

int *ar=new int[x]; //x-size of array, I don't know it in the beggining, 

P.S。如果我想使用std::vector,我不会问它,所以不要告诉我使用它:)

3 个答案:

答案 0 :(得分:2)

intersection(Hours1, Hours2, Matching). 专为此而设计。

如果你不能使用std::vector我可以看到几个选项。

1)使用数组终止符。

如果您的数组应该只包含正数(例如)或给定范围内的数字,那么您可以使用非法值(例如-1)作为数组终止符。

std::vector

2)将长度嵌入数组中。

对于数字数组,按照惯例,您可以将其长度存储在第一个元素中。

for(int* i = arr; *i != -1; ++i)
{
    // do something with *i
}

答案 1 :(得分:0)

没有。这是每个人都使用容器的一个原因。如果std :: vector不能让你满意,你可以自己制作一个容器。

编辑:由于动态数组大小是在运行时确定的,某人必须将大小存储在某个地方(除非您愿意使用哨兵值)。甚至编译器也无法提供帮助,因为大小是在运行时确定的。

答案 2 :(得分:0)

如果您想将动态数组的大小存储在其中,那么just do so

#include <iostream>
#include <cstdint>
#include <cstddef>
using std::size_t;

struct head_t { size_t size; int data[]; };

int main() {
    head_t* h = static_cast<head_t*>(::operator new(sizeof(head_t) + 10 * sizeof(int)));
    h->size = 10;
    int* my_10_ints = h->data;
    // Oh noez! I forgot 10!
    size_t what_was_10_again = static_cast<head_t*>(static_cast<void*>(my_10_ints) - offsetof(head_t, data))->size;
    ::std::cout << what_was_10_again << "\n";
    ::operator delete(static_cast<void*>(my_10_ints) - offsetof(head_t, data));
}

You can even put that functionality in a libraryesque set of functions!哦,一旦你这样做,你就会发现你可以只有一个unordered_map来映射指向大小的指针。但这就像使用vector:完全无聊。