2010-12-18 71 views
1

我想創建一個函數,它接受一個整數作爲它的參數並返回一個C++數組。這是僞代碼,我腦子裏想的:以整數作爲參數並返回一個數組

function returnarray(integer i) 
{ 
    integer intarr[i]; 

    for (integer j = 0; j < i; j++) { intarr[j] = j; } 

    return intarr; 
} 

我想聲明returnarray作爲功能*返回一個指針的常見方式,但我不能拿一個整數作爲我的參數。我也不能將j分配給intarr [j]。我真的很想避免把一個指針指向一個int,所以我可以使用這個參數。

有沒有辦法做到這一點,並能夠將j指定給intarr [j]而無需爲其指針?

編輯:

忘了寫我想避免載體。我只有在真的需要時才使用它們! (我的理由是我的)。

感謝:d

+0

這有什麼好做的函數指針,所以我刪除了標籤。 – sepp2k 2010-12-18 21:32:37

+3

你需要說明你希望避免載體的原因。矢量提供了明顯的解決方案;回答者需要知道您施加的潛在解決方案有哪些限制。 – 2010-12-18 21:52:09

+0

@MisterSir:如果你不想使用矢量,那麼,你躺在你自己製作的牀上。 – Puppy 2010-12-18 21:56:46

回答

0

您需要使用動態內存。事情是這樣的

int* returnArray(int size) { 
    int* array = new int[size]; 
    for(int i = 0; i < size; ++i) 
     array[i] = i; 
    return array; 
} 
+2

不要忘記初始化數組中的值(根據張貼的僞代碼):) – pstrjds 2010-12-18 21:36:47

+0

@pstrjds更正:) – EnabrenTane 2010-12-18 21:41:30

+4

-1這是ungood,因爲它教會初學者使用原始指針,並使用'new'和'delete' ,手動處理生命期。它只是停止傾斜很長一段時間,因爲初學者必須處理大多數無關的問題。那麼後來這個人必須忘掉所有這些東西。 – 2010-12-18 21:45:24

5

你的代碼甚至無法接近有效的C++,所以我假定你是初學者總

使用std::vector

#include <vector> 

std::vector<int> yourFunction(int n) 
{ 
    std::vector<int> result; 
    for(int i = 0; i < n; ++i) 
    { 
     result.push_back(i); 
    } 
    return result; 
} 

免責聲明:代碼被編譯器的手觸及。

乾杯&心連心,

+1

這只是僞代碼,旨在顯示我正在嘗試做什麼。我可以使用矢量,但我也忘了寫我想避免矢量。可以使用它們,但它會讓我的代碼更加複雜,因爲我需要直接處理數組。不過謝謝。 – Lockhead 2010-12-18 21:34:05

+5

@MisterSir:使用'std :: vector'將使你的代碼更簡單,不會更復雜。首先,不可能有一個返回數組的函數,所以你必須執行_something_ else。返回一個'std :: vector'幾乎在每個方面都是最簡單的選擇。 – 2010-12-18 21:45:40

+0

考慮result.reserve(n)。否則,push_back對於較大的n值將會表現不佳。根據實施情況,通常矢量會增加1.5到2倍。這意味着您將不得不重新分配和memcpy。 – EnabrenTane 2010-12-18 22:38:34

10

您不能返回堆棧分配陣列 - 這將超出範圍和內存釋放。另外,C++不允許堆棧分配的可變長度數組。你應該使用std :: vector。

std::vector<int> returnarray(int i) { 
    std::vector<int> ret(i); 
    for(int j = 0; j < i; j++) ret[j] = j; 
    return ret; 
} 
+0

如果您對STL向量感到滿意,那就太棒了。如果你更熟悉C代碼,我的答案更「老派」 它的味道,每種方法都有其優點和缺點 – EnabrenTane 2010-12-18 21:33:20

+0

+1爲簡潔的答案,但我想知道是否有任何額外的好處有返回一個'const std :: vector '? – ig2r 2010-12-18 21:35:11

+1

@EnabrenTane:不,這根本不是真的。你的方法有一個巨大的程序破壞缺點列表。像,沒有邊界檢查,沒有例外安全,沒有自動釋放,沒有語義執行。它具有的唯一優點是交叉編譯/跨語言鏈接能力。每個C++程序員都應該對STL向量感到滿意。這個答案令人難以置信的錯誤是這些C++概念存在的全部原因。 @ ig2r:不,沒有。 – Puppy 2010-12-18 21:53:31

1

兩個言論,使用優秀@DeadMG的解決方案之前:

1)你永遠要避免載體。如果v是一個向量,並且您確實需要一個指針,則可以通過編寫&v[0]來始終指向第一個元素。 2)你不能返回數組。您將返回一個指向新內存區域的指針,一旦完成,您將不得不刪除它。向量只是具有自動刪除功能的陣列,因此您不會泄漏內存。

0

不是我特別推薦這種方法,但您可以使用模板來做到這一點,而不訴諸動態內存分配。不幸的是,你不能從函數返回數組,所以你需要返回一個結構與數組裏面。

template <int N> 
struct int_array_type { 
    int ints[N]; 
}; 

template <int N> 
int_array_type<N> returnarray() { 
    int_array_type<N> a; 
    for (int i = 0; i < N; ++i) 
     a.ints[i] = i; 
    return a; 
} 

...

int_array_type<10> u = returnarray<10>(); 
std::copy(u.ints, u.ints+sizeof(u.ints)/sizeof(u.ints[0]), 
    std::ostream_iterator<int>(std::cout, "\n")); 
相關問題