2012-04-17 96 views
2

我發現使用矢量是實現我需要做的最好的方法,但是我現在需要一些解釋。從主函數返回多維向量,如何正確使用?

我需要在外部CPP中的函數中生成一個多維數組,然後在main中使用這個數組。

的main.cpp

// include vector, using namespace etc. 
function(2, 4); 

// how to access vector elements here - vectorname[2][4]->classvar; ? 

vectors.cpp

void function(value1, value2){ 
// class def 
int value1 = value1; 
int value2 = value2; 
vector<int>(value1)<vector<Class>(value2) vectorname>; // incorrect syntax? or new * vector ? 

return vectorname; // ? 
} 

回答

2

vector的語法需要一點習慣。的int二維矢量看起來是這樣的:

vector<vector<int> > myVector; 

如果你想設置的具體尺寸是採取大小,使用的構造函數:

vector<vector<int> > myVector(10, vector<int>(5)); 

這將產生零的10x5載體。您可以這樣做

vector<vector<int> > myVector(10, vector<int>(5, -1)); 

爲您的元素(在這種情況下爲-1)提供初始值。

作爲一個經驗法則,你希望你的向量通過引用傳遞並通過值返回。

+0

謝謝。我不知道向量需要的大小,直到它在函數中創建,所以我需要在沒有默認值的情況下在main中定義它,並通過引用傳遞它? – 2012-04-17 14:38:50

+0

@JackFarrow你當然可以做到這一點。你也可以不用'main'初始化它,然後按值返回:'vector > myVect = function(4,6);' – dasblinkenlight 2012-04-17 14:43:09

+0

謝謝。你能解釋一下上面的代碼中發生了什麼嗎?我認爲這是定義一個向量(像一個int,稱爲myVect),並將其賦值給函數中創建的向量值?這是最好的表現嗎? – 2012-04-17 14:53:34

1

如果你希望你的類的多維向量,它應該是:

vector<vector<Class> > vectorname; 
return vectorname; 

的簽名功能應爲:

vector<vector<Class> > function(value1, value2) 

和以下:

int value1 = value1; 
int value2 = value2; 

是毫無意義的。

+0

感謝您的回覆。那麼簽名需要去哪裏,在函數內部還是內部?如果主要內部如何爲函數內的向量賦值?以正常的方式?謝謝。 – 2012-04-17 14:35:12

+0

@JackFarrow簽名發送到你聲明函數的地方,並在定義中。你用'push_back'改變vector的內容,或者你可以預先分配內存並使用'[] []'。 – 2012-04-17 14:38:32

0

你可以做這樣的:

1 #include <iostream> 
    2 #include <vector> 
    3 using namespace std; 
    4 
    5 class Test { 
    6 public: 
    7  Test() 
    8  { 
    9   cout << "Test()" << endl; 
10  } 
11  ~Test() 
12  { 
13   cout << "~Test()" << endl; 
14  } 
15 }; 
16 typedef Test classvar_t; 
17 typedef vector<classvar_t> d2_t; 
18 typedef vector<d2_t > md_vector_t; 
19 md_vector_t foo(int value1, int value2) 
20 { 
21  return md_vector_t(value1, d2_t(value2)); 
22 } 
23 
24 int main() 
25 { 
26  md_vector_t v = foo(3, 4); 
27  cout << "--------" << endl; 
28  return 0; 
29 } 
+0

你可以,但爲什麼你會,當它導致內存泄漏? – 2012-04-17 14:50:05

+0

是的,過去的一個會導致內存泄漏,如果你生成它並沒有刪除它,我現在已經變得更好了。 – user1337700 2012-04-17 15:12:59

1

可以聲明一個多維向量是這樣的:

std::vector< std::vector<int> > v; 

您還可以使用的typedef使代碼更容易理解:

typedef std::vector<int> int_vector; 
typedef std::vector<int_vector> int_matrix; 

當像第一個例子那樣書寫時,應該避免將閉角尖括號寫一個另一個是避免編譯器將其與>>運營商混淆。

您還應該避免從函數返回像這樣的對象,因爲此操作涉及複製整個向量。相反,例如可以通過引用傳遞一個向量:

void process(int_matrix& m) 
{ 
    // m.push_back(...) 
} 

int main(int argc, char* argv[]) 
{ 
    int_matrix m; 

    // Initialize m here. 
    // ... 

    // Call your methods. 
    process(m); 

    // ... 

    return 0; 
} 

編輯:

您可以構建這樣的代碼:

// int_matrix.hpp 

#ifndef _INT_MATRIX_HPP 
#define _INT_MATRIX_HPP 

#include <vector> 

typedef std::vector<int> int_vector; 
typedef std::vector<int_vector> int_matrix; 

extern void process(int_matrix& m); 

#endif // ~_INT_MATRIX_HPP 

// int_matrix.cpp 

#include "int_matrix.hpp" 

void process(int_matrix& m) 
{ 
    m.clear(); 
    // ... 
} 

// main.cpp 

#include "int_matrix.hpp" 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    int_matrix m1; 
    int_matrix m2; 

    // ... 

    process(m1); 
    process(m2); 

    // ... 

    return 0; 
} 
+0

謝謝。我想接下來的問題是如何正確地轉發聲明這個向量,因爲函數將在main的外部?這甚至可以完成?! – 2012-04-17 22:29:11

+0

請參閱編輯我的答案,瞭解如何執行此操作的示例。 – npclaudiu 2012-04-18 06:32:41