您可以製作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_ptr或std::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> >
「得到了很多其他的事情」,但組成比在大多數情況下繼承好。
'MyObject obj = new MyObject;'不能編譯。 – john
你想在堆棧或堆上創建它們嗎? –
這是一個毫無意義的問題,除非你對「最好」的含義有所瞭解。 – john