2012-03-02 86 views
0

我有一個在這種情況下,如何優化一對結構?

template<class Key, class Value, class Comp = std::less<Key> > class MyContainer; 

其與節點的樹內部,其中,每個節點類型定義如下實施:

typedef std::pair<Key, Value> Node; 

要擦除從所述容器的一個元件我需要提供下面的方法給用戶:

void MyContainer::erase(const Key& k) { 
    const Node n(k, default_value); // default_value is a data member, copied from Value() by default in the constructor of MyContainer 
    //... 
    mytree->remove(n); // search and remove the Node in case 
} 

樹用途(衍生自所述包裝類)less<Key>進行比較和排序在T中的元素稀土元素。

如您所知,樹中的remove()方法並不需要訪問該對的第二個元素來查找該節點。由於這個原因,我想避免default_value副本的開銷到pair的第二個元素。

有沒有辦法擺脫這種不必要的開銷?

編輯:類型的樹給出

template<class T, class Comp = std::less<T> > class Tree; 
+1

爲什麼你就不能添加,需要一個'const的關鍵&'?什麼類型'mytree'? – 2012-03-02 11:52:26

+0

一個'remove'方法@David MyContainer是(一種)HashMap,其中每個桶是樹 – Martin 2012-03-02 12:07:01

回答

0

我假設你正在使用defualt_value作爲某種佔位爲accept anything? (如序言)

如果是這樣,我會改變它,以便您搜索容器中的密鑰,然後刪除該元素(S)。 (這可能是remove過載或只是一個發現後跟一個明確的節點去除。

你試圖重新調整你對基於刪除功能聽起來像一個過於複雜的設計。

void MyContainer::erase(const Key& k) { 
    const Node n(k, default_value); 
    auto n=mytree->find(k); 
    mytree->remove_node(*n); //or whatever you syntax is 
} 

我假設,因爲你使用模板和良好的作風,你所熟悉的std::mapstd::multimap有無序equivelants。

+0

MyContainer是(一種)HashMap,其中每個桶是一棵樹 – Martin 2012-03-02 12:05:17

+0

好的,出於興趣會不會更好。 'std :: unordered_map ',重新實現輪子通常是要避免的事情(注意如果你沒有C++ 11,你可以使用boost無序映射它是非常相似的 – 111111 2012-03-02 12:08:02

+0

作爲一個例子,我有GCC4.7,真的不喜歡unordered_map如何實現那裏。該hashmap實現消耗太多的內存我的需要。即使clear()沒有合理地使地圖使用空我認爲在HashMap背後有很多實現細節,有時候值得重新實現一些特定的需求 – Martin 2012-03-02 12:18:57