2013-11-26 90 views
0

我想存儲C++中的M×N的表對象,我想創建這樣的對象:什麼可以是存儲二維數組對象的最佳方法?

Vector2D<MyObject*> objects = new Vector2D<MyObject*>(M,N); 
MyObject* obj = new MyObject; 
objects.add(i,j, obj); 

,後來,我應該訪問類似的方式的項目。 請給我最好的想法,而不僅僅是方式。我知道其中很少。 :)

編輯: 基本上我需要的是,只分配通用對象的MxN網格的內存。只需添加/檢索具有給定的行和列的項目。

+1

'MyObject obj = new MyObject;'不能編譯。 – john

+0

你想在堆棧或堆上創建它們嗎? –

+0

這是一個毫無意義的問題,除非你對「最好」的含義有所瞭解。 – john

回答

0

更好的使用STRUCT的數組,結構領域取決於

1

的最直接方式是什麼樣的你的MyObject的領域:

vector<vector<MyObject>> objects ; 

不幸的是,你將不得不寫一些代碼來初始化每行的大小爲N.

在Stephan T. Lavavej(是的,他的首字母是STL)的microsoft channel9網站上有一個很好的演講,正是爲了解決nurikabe難題。

C9 - STL lecture - Nurikabe solver

2

看來你從Java或C#世界在C++領域來了。歡迎。在C++中,你有自動存儲對象,你不需要任何東西。如果您還有Vector2D課程,這已經足夠了。

Vector2D<MyObject> objects(M,N); 
MyObject obj; 
objects.add(i,j, obj); 

否則,您可以通過std::vector使2D矢量:

std::vector<std::vector<MyObject>> objects; 
+0

是的,我來自java的背景。現在的問題是我需要Vector2D類。我在問什麼可以更好地實現它。 –

+0

@ dg_no_9:我用'std :: vector'寫了一個樣本。 – deepmax

+0

使用'std :: vector >實現它有什麼問題?'這是*簡單*的方法。你仍然沒有說出最適合你的方式。 – john

0

我會創建矢量的矢量和過載所有需要的運營商。所以你可以重用std實現。首先想一下,你想如何訪問這個Vector2D。它是一個真正的矢量還是更好的其他存儲類型?

+0

我只想訪問帶有行,列索引的2d數組。對於例如array.getObj(row,col); –

0

有了你可以使用內置的arrayinitializer_lists,它會是這個樣子了現代C++編譯器11:

#include <array> 
    using namespace std; 
    ... 

    vector<vector<int>> Objects; 

    // Initialization 
    Objects = {{1,2,3}, {4,4,5}}; 
    // Iterating 
    for (auto it = Objects.begin(); it != Objects.end(); ++it) { 
     // you can access the arrays with *it in here 
     for(auto it2 = *it->begin(); it2 != *it->end(); ++it2) { 
     // you can access values directly with *it2 
     *it2 = 1; 
     } 
    } 

您可以使用汽車,讓編譯器斷定類型,因爲我做過或者你可以指定itit2實際上是向量迭代器。

1

您可以製作2D矢量。參考:std::vector

std::vector<std::vector<MyObject>> objects; 

但是在使用此對象之前,您應該已經創建了此對象。

// you know the size of your 2D : MaxRow, MaxCol 
std::vector<std::vector<MyObject> > objects(MaxRow, 
           std::vector<MyObject>(MaxCol, MyObject()); 

或者你可以

std::vector<std::vector<MyObject> > objects; 
for(size_t r_i=0; r_i<MaxRow; ++r_i) { 
     // create and push a row in the 2D matrix. 
     objects.push_back(std::vector<MyObject>()); 
     for(size_t c_i=0; c_i<MaxCol; ++c_i) { 
      // push a col in the new created row. 
      objects[r_i].push_back(MyObject()); 
     } 
} 

現在你要訪問你的矩陣。

size_t row, col; 
// now you know your row and col : input or from anywhere 

比方說,你在MyObject類有一個函數callObject

// you can do this. 
objects[row][col].callObject(); 

但是,如果你想存儲稀疏矩陣,那麼你可以做

std::vector<std::vector<MyObject*>objects(MaxRow, 
          std::vector<MyObject>(MaxCol, nullptr); 
objects[2][3] = new MyObject(/*your arguments*/); 

objects[2][3].callObject(); 

objects[0][0].callObject(); // Boom !!! Null pointer here. 

的指針使用,std::unique_ptrstd::shared_ptr


如果你想要一個Vector2D類,你可以用它來環繞這個矢量向量。

typedef MyObject T; 
class Vector2D { 
     std::vector<std::vector<T> > objects; 
     public: 
     // initialize the objects with MaxRow rows each with MaxCol cols. 
     Vector2D(size_t MaxRow, size_t MaxCol); 
     // remember that there should already be somebody at this row or col 
     // or you have to create all the rows before this row and all the cols before 
     // this col in this row. 
     void addItem(size_t row, size_t col, const MyObject & obj); 
}; 

我用typedef int T,因爲它會改變對模板容易。


正如我之前所說的,它取決於你想要什麼和你的數據。如果它的稀疏類型,我會使用指針向量的向量。

typedef MyObject T; 
class Vector2D { 
     std::vector<std::vector<std::unique_ptr<T> > > objects; 
     public: 
     // initialize the Nullptr with MaxRow rows each with MaxCol cols. 
     Vector2D(size_t MaxRow, size_t MaxCol); 
     // now you can just add the item, as pointer is already there. 
     void addItem(size_t row, size_t col, MyObject * obj); 
}; 

使用unique_ptr,因爲它負責刪除和其他引用事情。


你可以有通過的Vector2D繼承std::vector< std::vector<T> >「得到了很多其他的事情」,但組成比在大多數情況下繼承好。

+0

謝謝,這似乎是一個好方法。我會試試看。 :) –

+0

用你的方式實現addItem(row,col,MyObject)功能的更好方法是什麼? –

+1

@ dg_no_9如果您的MyObject類的大小很小,那麼使用帶有虛擬MyObjects的矩陣初始填充的向量>就可以。但如果它的大,那麼我會考慮使用向量的指針向量。然後你可以創建一個函數addItem。 –

相關問題