2014-10-21 126 views
1

我在程序中有以下類。boost上的多索引:: ptr_vector

class Class1 { 

    public: 

     boost::ptr_vector<Class2> fields; 
} 

class Class2 { 

    public: 

     std:string name; 
     unsigned int value; 
} 

欲寫在Class1成員函數返回一個引用或指針基於等級2的name變量fields的元件。我不必關心容器中物體的壽命。

目前,我正在返回一個迭代器到我想要的元素後,該函數從矢量開始搜索元素。

boost::ptr_vector<Class2>::iterator getFieldByName(std::string name) { 

    boost::ptr_vector<Class2>::iterator field = fields.begin(); 

    while (field != fields.end()) { 

     if (field->name.compare(name) == 0) { 
      return field; 
     } 
     ++field; 
    } 

    return fields.end(); 
} 

是我所面臨的問題是:

(1)我需要的元素快速隨機訪問或程序坐在getFieldByName()太長(開始時boost::ptr_vector<>太慢在容器的開頭)

(2)我需要保留字段的插入順序(所以我不能使用boost::ptr_map<>直接)

我已經發現的boost ::多指標,它似乎可以提供問題的解決方案,但我需要使用智能容器,以便銷燬容器也會破壞容器所擁有的對象。

有無論如何實現一個智能容器,有多種訪問方法?

+0

取消引用迭代器。它返回的值是一個參考。返回,也作爲參考。 – Brent 2014-10-21 21:11:56

+0

@Brent我一定會在最後的功能中做到這一點。我更關心快速訪問數據並保留插入順序 – packersfan16 2014-10-21 21:14:20

+1

哦,我明白了。你想O(log(n))查找而不是O(n)。巴里的回答看起來不錯。 – Brent 2014-10-21 21:15:31

回答

0

您可以使用兩個容器。有一個存儲實際數據的boost::ptr_map<>,然後有一個std::vector<>存儲指向地圖節點的指針。

boost::ptr_map<std::string, Class2> by_field; 
std::vector<Class2 const*> by_order; 

void insert(Class2* obj) { 
    if (by_field.insert(obj->name, obj).second) { 
     // on insertion success, also add to by_order 
     by_order.push_back(obj); 
    } 
} 

這將使你在getFieldByName()功能O(lg n)接入(只是看它在by_field),同時還保留插入順序(只是看它在by_order)。

+0

你不能做任何這樣的事情,因爲ptr_map和ptr_vector擁有它們的元素數據。 – sehe 2014-10-21 23:32:38

+0

不好意思,'std :: vector '無論'Node'的正確值是什麼。那真的值得讚賞嗎? – Barry 2014-10-22 12:36:02

+0

我不明白爲什麼不。由於我指出的原因,這是很多手揮手,也偶然不正確。有更多優點的評論 – sehe 2014-10-22 15:11:38

相關問題