如何使用可变数量的元素[C ++]声明一个数组?

时间:2016-02-07 15:02:53

标签: c++ arrays dynamic

如何[动态?]使用' i'来声明数组?元素数量?

4 个答案:

答案 0 :(得分:2)

通过使用标准库的容器,最常见的是std::vector<>

其他解决方案包含手动分配和内存释放,可能不值得付出努力。

答案 1 :(得分:1)

您可以使用std::vector<T>。它就像

一样
std::vector<int> a;
a.push_back(2);    // add 2 to the array
a.push_back(4);

你可以继续,你不必担心内存分配问题。

答案 2 :(得分:1)

你必须使用指针。 示例:

float *ptrarray = new float [10];

基本上,输入* pointername = new type [i];

不要忘记清理记忆:

delete [] ptrarray; 

或者在程序结束前保留。

答案 3 :(得分:1)

创建动态大小的数组

std::size_t N = 10;
SomeType *a = new SomeType[N];
for (auto i=0; i<N; ++i) {
    std::cout << a[i] << std::endl;
}
delete [] a;

C ++数组是指向包含特定类型的连续内存块的指针。此片段为10个SomeType个实例的数组分配空间,构造使用默认构造函数初始化每个对象的数组,遍历数组,打印出每个元素,然后通过调用delete []释放内存

要点:

  • 您需要致电delete []以取消分配数组。需要数组表单以确保在每个对象上调用析构函数。
  • 分配后,无法恢复数组的大小。
  • 您可以通过索引(或指针)
  • 遍历数组

不是你想要的方式,继续阅读。

使用矢量

std::size_t N = 10;
std::vector<SomeType> v(10);
for (auto iter=v.begin(); iter!=v.end(); ++iter) {
    std::cout << *iter << std::endl;
}

此代码段使用std::vector为您管理连续的内存块。注意使用迭代器来遍历向量而不是使用索引。向量确实支持直接索引,因此前面示例中使用的for循环也适用于此。

for (auto i=0; i<v.size(); ++i) {
    std::cout << v[i] << std::endl;
}

使用迭代器是最佳实践和惯用语虽然使用for循环可能不是,但我离题了。

要点:

  • 在向量
  • 的情况下,内存管理是自动的
  • 您可以使用push_back
  • 附加
  • 向量知道其中有多少元素 - 调用v.size()以获取元素数量
  • 使用iteratorv.begin()
  • 返回的v.end()执行迭代

只需使用std::vector即可。如果您需要对基础指针的原始访问权限,请使用&v[0]v.data()但不要这样做,除非您需要。另外,不要将std::auto_ptr用于数组。你会受到诱惑,但不要这样做。