2012-02-27 82 views
0

我有一個項目在c + + 03有一個problem與數據結構:我使用矢量而不是列表,即使我不得不連續pop_front-push_back。但現在可以,因爲我現在需要重寫太多的代碼。彈出式元素從std :: vector和重用元素

我的做法是tu有一個最後frame_size點的緩衝區始終更新。所以每一幀我都要彈出並推回去。 (mayebe有這種方法的名稱?)

,所以我用這個代碼:

Point apoint; // allocate new point 
apoint.x = xx; 
apoint.y = yy; 

int size = points.size() 
if (size > frame_size) { 
    this->points.erase(points.begin()); // pop_front 
} 
this->points.push_back(apoint); 

我有對象池的一些準備使用的代碼,所以我想:這是不是很棒的優化,但我可以將前端存儲在池中,因此我可以獲得apoint的分配時間。

好吧,這不是很有用,也許它沒有任何意義,但我只問教育的好奇心:我該怎麼做?

如何可以存儲矢量的擦除元件的存儲器用於重複使用它?這個問題有意義嗎?如果不是,爲什麼?

..因爲擦除不返回擦除矢量,它返回:

隨機訪問迭代器指向的元素 的新位置,然後函數調用,這是抹去了最後一個元素 如果操作刪除了 序列中的最後一個元素,則向量結束。

+2

如果你持續使用'pop_front',而不想使用'list',那爲什麼不使用'std :: deque'? – 2012-02-27 11:08:56

+0

問題是我有很多使用std :: vector的實用程序,所以我需要打開實用程序的存儲庫,將它分叉,然後模板(或重寫)所有采用向量來使其可用於列表或Deque的所有內容 – nkint 2012-02-27 11:11:40

+0

Point重量的創造?您正在存儲對象,而不是指向向量中的對象的指針。如果要將對象保存在池中,最好將它們存儲爲指針而不是對象。 – Jagannath 2012-02-27 11:19:57

回答

2

我有一些隨時可以使用的代碼對象池......我該怎麼做?

使用矢量,你不能。一個向量將其元素存儲在一個連續的數組中,因此它們不能一次分配一個,只能以任意大小的塊分配。因此,不能將對象池用作std::vector的分配程序。

我該如何存儲擦除的元素的內存重用它?這個問題有意義嗎?如果不是,爲什麼?

該矢量已經做到了。您致電erase會將所有元素向下移動到第一個元素騰出的空間中,在末尾留出空白區域以將新元素推入。

只要你使用一個向量,當你擦除第一個元素時,你無法避免移動所有的元素;如果效率太低,則改爲使用deque(或可能使用list)。

1

我不知道理解你想做的事,但是這應該是functionnally相當於你寫的東西,沒有構建臨時Point實例:

// don't do this on an empty vector 
assert (points.size() > 0); 

// rotate elements in the vector, erasing the first element 
// and duplicating the last one 
copy (points.begin()+1, points.end(), points.begin()); 

// overwrite the last element with your new data 
points.back().x = xx; 
points.back().y = yy; 

編輯:麥克西摩在評論中指出,這個解決方案和問題中提出的方法都不會導致任何新的內存分配。

+0

最後2條語句應該在if條件中嗎? – Jagannath 2012-02-27 11:28:51

+0

只要刪除if條件,應該想要@nkint想要的。 – Jagannath 2012-02-27 11:33:34

+0

@Jagannath @兩種方式應該是等價的,但你是對的:你的優雅和緊湊。 – Francesco 2012-02-27 11:36:33

相關問題