簡體   English   中英

在C ++中返回多維數組的函數

[英]Function that returns multidimensional array in C++

作為一名Java程序員,我很難獲得一個返回多維數組的函數。 我將如何在C ++中編寫代碼?:

int[][] theFunction(){
  int[][] var = new int[3][3];
  // code
  return var;
}

在C ++中,最簡單的方法是這樣的:

std::vector<std::vector<int> > theFunction() {
    std::vector<std::vector<int> > var(3, std::vector<int>(3));
    // code
    return var;
}

您需要包含<vector>才能進行編譯。 與Java通用容器不同,C ++模板容器不會產生將基元包裝到對象中的成本,因此它們在性能和內存消耗方面可以保持極其高效,同時提供大量額外的靈活性。

一般來說,你應該更喜歡C ++風格的容器( std::vectorstd::setstd::map ,以及在C ++ 11, std::array ),而不是靈活的內置替代品“繼承” C。

簡而言之,在C中(比方說,你使用的是C ++中的方言[C ++是C的超集,有一些修改])你不能從函數中返回向量和矩陣。 但是,你可以返回一個指針(可能這對你沒什么幫助)。

在C和C ++中,向量的名稱(讓我們簡化它)是指向第一個位置的指針,因此:

int v[] = { 1, 2, 3 };
int * ptr = v;

指針是一個內存地址,您可以使用它來運行所有元素(盡管它可能很危險):

for( ; ptr < ( v + 3 ); ++ptr) {
     std::cout << *ptr << stD::endl;
}

並且可以返回該指針:

int * vectorCreator(int max)
{
    int * v = new int[max];
    return v;
}

請注意,在這種情況下,調用者負責在完成后釋放向量。 這是一個你可以用auto_ptr解決的問題(使用新標准已經過時了,你應該在編譯器允許的情況下使用unique_ptr )。

auto_ptr<int> vectorCreator(int max)
{
    int * v = new int[max];
    return auto_ptr<int>( v );
}

在這個方向上工作的是C ++標准庫的一部分,你可以使用vector<>模板,它更安全,更安全。

希望這可以幫助。

正如其他人所說,你可以返回一個std::vector<std::vector<int> > 值得指出的是,這是C ++的返回值優化非常重要的情況 - 特別是,只要查看這段代碼,您可能會認為在函數返回時必須復制整個向量向量(從C ++開始)函數的返回值由值返回)。 但是這種由C ++明確允許並且幾乎由任何編譯器實現的優化允許函數在將要返回的任何結構中分配向量。

std::vector<std::vector<int> > theFunction() {
    std::vector<std::vector<int> > var;
    // code
    return var;
}

你不會在C ++中使用C數組(在vector看起來像Java數組),你可以使用vector

typedef std::vector<std::vector<int> > VecType;

VecType theFunction()
{
  VecType var(3, std::vector<int>(3));
  // code
  return var;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM