如何声明具有可变数量元素的数组[C++]?

Posted

技术标签:

【中文标题】如何声明具有可变数量元素的数组[C++]?【英文标题】:How to declare an array with a variable number of elements [C++]? 【发布时间】:2016-02-07 15:02:52 【问题描述】:

我如何[动态地?]声明一个包含“i”个元素的数组?

【问题讨论】:

你肯定不会使用 malloc。 你不会动态地“声明”任何东西。声明是程序源的一部分。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

您可以继续使用,无需担心内存分配问题。

【讨论】:

//add 2 to the array 具有误导性。 std::array&lt;T&gt;std::vector&lt;T&gt; 是不同的。【参考方案3】:

你必须使用指针。 示例:

float *ptrarray = new float [10];

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

别忘了清理你的记忆:

delete [] ptrarray; 

或者保留到程序结束。

【讨论】:

你没有使用指针,至少也没有明确的。并且使用原始的new 会导致代码脆弱。最好使用标准库容器,或者至少使用某种智能指针。 @juanchopanza 你是对的。这只是我的小英语问题。感谢您提供有用的建议!【参考方案4】:

创建一个动态大小的数组

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++ 数组是指向包含特定类型的连续内存块的指针。这个 sn-p 为 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;

这个 sn-p 使用 std::vector 为您管理一个连续的内存块。请注意使用迭代器遍历向量而不是使用索引。向量确实支持直接索引,因此前面示例中使用的 for 循环也可以在这里工作。

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

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

关键点:

对于向量,内存管理是自动的 你可以使用push_back追加 向量知道其中有多少元素 -- 调用 v.size() 以获取元素数量 使用从v.begin()v.end() 返回的iterators 执行迭代

只需使用std::vector。如果您需要对底层指针进行原始访问,请使用&amp;v[0]v.data(),但除非您需要,否则不要这样做。另外,不要将std::auto_ptr 用于数组。你会受到诱惑但不要这样做。

【讨论】:

以上是关于如何声明具有可变数量元素的数组[C++]?的主要内容,如果未能解决你的问题,请参考以下文章

具有可变大小行的 C++ 二维数组

如何在 C# 中声明具有固定数量的固定大小字符串的数组?

Python C++ API - 具有可变数量参数的重载函数

使用流在 C++ 中读取可变长度输入

创建一个 GLSL 制服数组?

使用jQuery AJAX将字符串数组传递给具有可变数量参数的webmethod