我有这个方法:
void createSomething(Items &items)
{
int arr[items.count]; // number of items
}
但是它抛出了一个错误:
expression must have a constant value
我找到了这个解决方案:
int** arr= new int*[items.count];
我想知道是否有更好的方法来处理这个问题?
std::vector
。void createSomething(Items &items)
{
std::vector<int> arr(items.count); // number of items
}
new
来分配数组。void createSomething(Items &items)
{
int* arr = new int[items.count]; // number of items
// also remember to clean up your memory
delete[] arr;
}
但是使用 std::vector
更安全,我认为更有帮助。
std::vector
的析构函数会自动清理内存,这也是为什么使用它比手动管理内存更好的原因之一。 - Cory KramerBuilt in arrays
和std::array
总是需要一个常量整数来确定它们的大小。当然,在动态数组的情况下(使用new
关键字创建的数组),可以使用非常量整数,就像您展示的那样。
然而,当涉及到数组类型应用
时,std::vector
(当然内部是动态数组)是最好的解决方案。这不仅因为它可以被赋予非常量整数作为大小,而且它可以有效地动态增长。此外,std::vector
还有许多花哨的函数可以帮助您完成工作。
在您的问题中,您只需将int arr[items.count];
替换为:
std::vector<int> arr(items.count); // You need to mention the type
// because std::vector is a class template, hence here 'int' is mentioned
std::vector
,您会发现在99%的情况下它比普通数组更加灵活,因此您更喜欢使用它。首先,您不需要担心删除它。向量会处理它。此外,像push_back
、insert
、emplace_back
、emplace
、erase
等函数帮助您对其进行有效的插入和删除,这意味着您不必手动编写这些函数。
有关更多参考,请参阅this
std::vector
。 - juanchopanzaint* arr = new int[items.count];
而不是使用指针数组。但当然,std::vector
更好。 - Ryan Haining