我刚开始学习C++。我正在网上阅读教程,现在我已经在函数中创建了一个动态分配的数组。
void array_() {
int size;
cin >> size;
int * Array = new int[size];
for (int i = 0; i < size; ++i)
cin >> Array[i];
}
如何将该函数返回到主函数中?
我刚开始学习C++。我正在网上阅读教程,现在我已经在函数中创建了一个动态分配的数组。
void array_() {
int size;
cin >> size;
int * Array = new int[size];
for (int i = 0; i < size; ++i)
cin >> Array[i];
}
首先,返回指针的同时也返回大小是明智的,否则无法安全地使用结果数组。
因此,我们正在寻找一种从函数中返回两个值的方法。可以通过采用引用参数来完成此操作,通过该参数分配其中一个值:
int *array_(int &size) {
std::cin >> size;
int *Array = new int[size];
for (int i = 0; i < size; ++i)
std::cin >> Array[i];
return Array;
}
int main() {
int size;
int *arr = array_(size);
// ...
delete[] arr; // Don't forget to delete[] what has been new[]'d!
}
或者,您可以返回一个包含两个值的std::pair
:
std::pair<int *, int> array_() {
int size;
std::cin >> size;
int * Array = new int[size];
for (int i = 0; i < size; ++i)
std::cin >> Array[i];
return {Array, size};
}
int main() {
auto arr = array_(size);
// ...
delete[] arr.second; // Don't forget still!
}
但是这两种方法都是非常糟糕的想法,所以你可以立刻开始编写真正的C++代码,使其不像畸形的C语言,并使用标准容器:
std::vector<int> array_() {
int size = 0;
std::cin >> size;
std::vector<int> vec(size);
for(int &i : vec)
std::cin >> i;
return vec;
}
int main() {
auto arr = array_(size);
// ...
// Now you can forget delete: no raw owning pointer, no worries.
}
简单,无泄漏和异常安全(理想情况下您也应该对用户输入进行消毒)。
std::vector<T>
不是Qt风格的隐式共享类。 - iksemyonovint* func(std::size_t& size_out) {
// int n = ...;
int* array = new int[n];
size_out = n;
return array;
}
int main() {
int size;
int* result = func(size);
delete[] result;
result = nullptr;
}
std::vector<T>
,但这似乎不是本次练习的重点。std::array<T,n>
是适用于 C++ 的正确数组语法糖,可以直接替换传统的 C 语言原始数组语法。std::vector
是一种不同类型的数据结构 [非常相似]。std::array
具有与原始数组相同的运行时行为和性能。(std::array
在编译期间会被转换为原始数组。) - Max Poweroperator new
手动分配资源。std::vector<int>
。它比动态分配的普通数组具有以下优点:
delete
)时,它将自动释放保留的内存。size()
方法,因此您始终知道向量中包含多少个元素。将其与动态普通数组进行比较,在其中您需要在另一个变量中存储大小。resize()
方法)。std::vector<int> array_()
{
int size;
cin >> size;
// Create a dynamic "array" with the given size.
std::vector<int> result( size );
for (int i = 0; i < size; ++i)
cin >> result[i];
return result;
}
main()
中使用那个“数组”:int main()
{
// Call function array_() and store the result in variable v.
std::vector<int> v = array_();
// Print all elements of v using range-based loop.
for( int x : v )
{
std::cout << x << '\n';
}
// Alternatively print all elements using classic loop with index.
for( int i = 0; i < v.size(); ++i )
{
std::cout << v[i] << '\n';
}
}
您可以返回动态分配的数组并返回其指针:
int* ProduceArray() {
...
int* arrayPtr = new int[size];
...
return arrayPtr;
}
然而,请注意,这样做会丢失数组大小的重要信息(对于使用数组的代码来说,避免缓冲区溢出非常重要)。
在现代C++中,更好的方法是返回标准库容器,如std::vector
,而不是原始指针。
请注意,std::vector
实例知道它们的大小,并自动释放它们的内存(相反,当你有原始拥有指针时,必须显式调用delete[]
)。
std::vector
现在是新宠了吗? :p - Quentin
int
? - juanchopanza