Bellow 是一個運行良好的簡單程式。它包含一個能夠回傳任意大小字串的函式。其大小由函式輸入決定。
#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 中呼叫的單個行程)回傳一個一維陣列 ( int toBeReturned[size to be determined]),我必須使用一個回傳指標的函式,然后將該函式包含在構造該陣列的宏中。
在 C 中是否有更簡單的方法來做到這一點?
如果不能,請解釋為什么這只適用于字串型別?我認為字串只是一個“char”型別的一維陣列。
謝謝,
丹尼爾
uj5u.com熱心網友回復:
函式可以按值回傳任何 POD 或型別別。
C 風格std::array是一個固定大小的陣列,包裹在一個型別別中,因此可以按值回傳。但是,C 風格的固定大小陣列不能按值回傳(但它可以存盤為型別別的成員,然后可以按值回傳,就像std::array這樣)。
C 樣式陣列不能動態調整大小(不使用非標準編譯器擴展),這就是為什么您必須使用new[]它,通過指標回傳它,然后delete[]在使用完后回傳它。
由于您希望函式回傳一個動態大小的陣列,因此您應該使用'ed 指標std::vector代替new[],例如:
#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;
}
uj5u.com熱心網友回復:
您可以使用您需要的任何型別的向量,并通過參考將其傳遞到您的函式中。
#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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/395875.html
上一篇:c洗掉動態結構中的元素
下一篇:我在C中的結構鏈表有問題
