如何声明具有可变数量元素的数组[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<T>
和 std::vector<T>
是不同的。【参考方案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()
返回的iterator
s 执行迭代
只需使用std::vector
。如果您需要对底层指针进行原始访问,请使用&v[0]
或v.data()
,但除非您需要,否则不要这样做。另外,不要将std::auto_ptr
用于数组。你会受到诱惑但不要这样做。
【讨论】:
以上是关于如何声明具有可变数量元素的数组[C++]?的主要内容,如果未能解决你的问题,请参考以下文章