c ++是否可以有一个进程(在main之外) returns 一个大小由输入决定的数组,而不使用指针或宏?
c++ Is it possible to have a process (outside of main) that returns an array whose size is determined by the input, without using pointers or macros?
Bellow 是一个运行良好的简单程序。它包含一个能够 return 任意大小的字符串的函数。其大小由函数输入决定。
#include <iostream>
using namespace std;
string strFunc(int a){
string toBeReturned;
for(int i=0; i < a; i++){
toBeReturned += '!';
}
return toBeReturned;
}
int main(){
int x = 5;
cout << strFunc(x) << endl;
return 0;
}
如果相反,我想要一个函数(或在 main 中调用的单个进程)到 return 一维数组 (int toBeReturned[size to be determined]
),我必须使用一个函数 return 是一个指针,然后将该函数包含在构造数组的宏中。
在 C++ 中有更简单的方法吗?
如果不能,谁能解释一下为什么这只适用于字符串类型?我认为字符串只是 'char'.
类型的一维数组
谢谢,
丹尼尔
您可以使用您需要的任何类型的向量,并通过引用将其传递到您的函数中。
#include <vector>
#include <chrono>
#include <iostream>
using namespace std;
void by_reference(vector<size_t>& v, size_t s)
{
v.clear();
v.resize(s, 0);
for (size_t i = 0; i < s; i++)
v[i] = i;
}
vector<size_t> by_return(size_t s)
{
vector<size_t> v(s, 0);
for (size_t i = 0; i < s; i++)
v[i] = i;
return v;
}
// Where s is large, by_reference is faster
// Where s is small, by_return is faster
// Use whichever works best for you and your situation
int main(void)
{
std::chrono::high_resolution_clock::time_point start_time, end_time;
std::chrono::duration<float, std::milli> elapsed;
start_time = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i < 1000; i++)
{
vector<size_t> v;
const size_t s = 10000000;
by_reference(v, s);
for (size_t i = 0; i < s; i++)
v[i] = i;
}
end_time = std::chrono::high_resolution_clock::now();
elapsed = end_time - start_time;
cout << "Duration: " << elapsed.count() / 1000.0f << " seconds" << endl;
start_time = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i < 1000; i++)
{
const size_t s = 10000000;
vector<size_t> v = by_return(s);
for (size_t i = 0; i < s; i++)
v[i] = i;
}
end_time = std::chrono::high_resolution_clock::now();
elapsed = end_time - start_time;
cout << "Duration: " << elapsed.count() / 1000.0f << " seconds" << endl;
return 0;
}
函数可以 return 任何 POD 或 class 按值键入。
C++ 风格的 std::array
是一个包装在 class 类型中的固定大小的数组,因此可以按值 return 编辑。但是,C 风格的固定大小的数组不能按值 returned(但它可以存储为 class 类型的成员,然后可以按值 returned ,就像 std::array
那样)。
C 样式数组不能动态调整大小(不使用 non-standard compiler extension),这就是为什么您必须 new[]
它,return 通过指针,然后 delete[]
当你用完它。
因为你想让你的函数return一个动态大小的数组,你应该使用std::vector
而不是new[]
ed指针,例如:
#include <iostream>
#include <vector>
using namespace std;
vector<int> strFunc(int a){
vector<int> toBeReturned(a);
for(size_t i = 0; i < a; ++i){
toBeReturned[i] = ...;
}
return toBeReturned;
}
int main(){
int x = 5;
vector<int> returned = strFunc(x);
for(size_t i = 0; i < x; ++i){
cout << returned[i] << ' ' << endl;
}
return 0;
}
Bellow 是一个运行良好的简单程序。它包含一个能够 return 任意大小的字符串的函数。其大小由函数输入决定。
#include <iostream>
using namespace std;
string strFunc(int a){
string toBeReturned;
for(int i=0; i < a; i++){
toBeReturned += '!';
}
return toBeReturned;
}
int main(){
int x = 5;
cout << strFunc(x) << endl;
return 0;
}
如果相反,我想要一个函数(或在 main 中调用的单个进程)到 return 一维数组 (int toBeReturned[size to be determined]
),我必须使用一个函数 return 是一个指针,然后将该函数包含在构造数组的宏中。
在 C++ 中有更简单的方法吗?
如果不能,谁能解释一下为什么这只适用于字符串类型?我认为字符串只是 'char'.
类型的一维数组谢谢,
丹尼尔
您可以使用您需要的任何类型的向量,并通过引用将其传递到您的函数中。
#include <vector>
#include <chrono>
#include <iostream>
using namespace std;
void by_reference(vector<size_t>& v, size_t s)
{
v.clear();
v.resize(s, 0);
for (size_t i = 0; i < s; i++)
v[i] = i;
}
vector<size_t> by_return(size_t s)
{
vector<size_t> v(s, 0);
for (size_t i = 0; i < s; i++)
v[i] = i;
return v;
}
// Where s is large, by_reference is faster
// Where s is small, by_return is faster
// Use whichever works best for you and your situation
int main(void)
{
std::chrono::high_resolution_clock::time_point start_time, end_time;
std::chrono::duration<float, std::milli> elapsed;
start_time = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i < 1000; i++)
{
vector<size_t> v;
const size_t s = 10000000;
by_reference(v, s);
for (size_t i = 0; i < s; i++)
v[i] = i;
}
end_time = std::chrono::high_resolution_clock::now();
elapsed = end_time - start_time;
cout << "Duration: " << elapsed.count() / 1000.0f << " seconds" << endl;
start_time = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i < 1000; i++)
{
const size_t s = 10000000;
vector<size_t> v = by_return(s);
for (size_t i = 0; i < s; i++)
v[i] = i;
}
end_time = std::chrono::high_resolution_clock::now();
elapsed = end_time - start_time;
cout << "Duration: " << elapsed.count() / 1000.0f << " seconds" << endl;
return 0;
}
函数可以 return 任何 POD 或 class 按值键入。
C++ 风格的 std::array
是一个包装在 class 类型中的固定大小的数组,因此可以按值 return 编辑。但是,C 风格的固定大小的数组不能按值 returned(但它可以存储为 class 类型的成员,然后可以按值 returned ,就像 std::array
那样)。
C 样式数组不能动态调整大小(不使用 non-standard compiler extension),这就是为什么您必须 new[]
它,return 通过指针,然后 delete[]
当你用完它。
因为你想让你的函数return一个动态大小的数组,你应该使用std::vector
而不是new[]
ed指针,例如:
#include <iostream>
#include <vector>
using namespace std;
vector<int> strFunc(int a){
vector<int> toBeReturned(a);
for(size_t i = 0; i < a; ++i){
toBeReturned[i] = ...;
}
return toBeReturned;
}
int main(){
int x = 5;
vector<int> returned = strFunc(x);
for(size_t i = 0; i < x; ++i){
cout << returned[i] << ' ' << endl;
}
return 0;
}