2012-09-26 157 views
1

我正在研究一個OpenGL/C++程序,我需要將座標存儲在我的窗口中,並將它們繪製在窗口中。但由於繪製點的數量是未定義的,我無法修正數組的大小。是否可以動態分配空間給數組?我可以使用任何其他數據結構來完成相同的任務嗎?動態分配數組

回答

6

是的,請改用std::vector

結合push_back您可以動態增加元素的數量。

std::vector<Coordinate> coordinates; 
coordinates.push_back(Coordinate(0,0)); 
coordinates.push_back(Coordinate(1,1)); 

,你會與一個陣列可以訪問相同的元素:

coordinates[0], coordinates[1]... 
+0

非常感謝! – parth

+2

如果連續內存不是您的需求,也可以考慮使用'std :: deque',因爲它在空間不足時不必重新分配所有內存。 –

0

如所建議的,一個std::vector是一個很好的選擇,這容器可確保鄰接的存儲器,通過它,這將是有用作爲座標緩衝區:

std::vector<Coordinate> coordinates; 
coordinates.push_back(Coordinate(0,0)); 
coordinates.push_back(Coordinate(1,1)); 
// ... add more coordinates... 

RenderBuffer(coordinates.data()); 

只要內存適合緩衝區格式,當然。

但是,由於使用連續內存的事實,由於內存塊的重新分配,插入方法可能很昂貴;如果這可能是你能擺脫它的問題預留尺寸一次,如果你知道內存的最大/最小requeriments:

// Create 100 instances of Coordinate and fill all instances with Coordinate(0, 0) 
std::vector<Coordinate> coordinates(100, Coordinate(0, 0)); 

coordinates[0] = Coordinate(0,0); 
coordinates[1] = Coordinate(1,1); 
// ... add more coordinates... 

RenderBuffer(coordinates.data()); 

但是,如果你這樣做,有沒有使用數組的區別:

// Create 100 instances of Coordinate and fill all instances with Coordinate(0, 0) 
Coordinate[100]; 

coordinates[0] = Coordinate(0,0); 
coordinates[1] = Coordinate(1,1); 
// ... add more coordinates... 

RenderBuffer(coordinates); 

有一個例外,該陣列不能如果它需要改變它的尺寸,但std::vector可以調整大小:

// Create 100 instances of Coordinate and fill all instances with Coordinate(0, 0) 
std::vector<Coordinate> coordinates(100, Coordinate(0, 0)); 

coordinates[0] = Coordinate(0,0); 
coordinates[1] = Coordinate(1,1); 
// ... add lots of lots of lots of coordinates... 

// Damn! We need more Coordinates, let's add more without worrying about resizing: 
coordinates.push_back(Coordinate(0,0)); 
coordinates.push_back(Coordinate(1,1));  

RenderBuffer(coordinates.data()); 

如果不需要連續內存,您必須考慮使用其他容器,如std::list,插入方法與std::list<>::push_back相同,但這種容器的插入完全不昂貴(至少不會像矢量那樣昂貴)。

您也可以使用方法std::vector<>::resize調整一次大小,而不是調整某些std::vector<>::push_back調用的大小。