2009-08-03 52 views
1

我有這樣集裝箱用兩個索引(或複合索引)

class MyClass 
{ 
    int Identifier; 
    int Context; 
    int Data; 
} 

一類,我打算將其存儲在一個STL容器一樣

vector<MyClass> myVector; 

,但我需要訪問它可以由外部指數(使用myVector[index]);而在這種情況下,我想

vector<MyClass>::iterator myIt; 
for(myIt = myVector.begin(); myIt != myVector.end(); myIt++) 
{ 
    if((myIt->Idenfifier == target_id) && 
     (myIt->Context == target_context)) 
     return *myIt; //or do something else... 
} 

的東西執行搜索的IdentifierContext組合有沒有更好的方式來存儲和索引的數據?

回答

2

Boost::Multi-Index具有這種確切的功能,如果你能負擔提升依賴(僅限頭部)。您可以使用random_access索引來創建類似數組的索引,並使用hashed_unique,hashed_non_unique,ordered_uniqueordered_non_unique(取決於您所需的特徵),並使用將標識符和上下文進行比較的函子。

0

是的,但如果你想要速度,你需要犧牲空間。以標識符/上下文爲關鍵字將其存儲在一個集合中(如STL集合),同時將其存儲在向量中。當然,您不需要數據本身的兩個副本,因此使用智能指針(auto_ptr或變體)將其存儲在集合中,並使用啞指針將其存儲在向量中。

+0

STL容器不能接受auto_ptrs,因爲它們擁有不兼容的所有權語義。 – 2009-08-03 19:13:36

+0

我懷疑這是爲什麼我說「或變體」。 shared_ptr會工作嗎? – 2009-08-03 19:24:28

1

我們需要知道您的使用情況。 爲什麼是否需要通過索引獲取它們,以及您需要多長時間搜索一次特定元素的容器?

如果您將它存儲在std::set中,您的搜索時間爲O(ln n),但不能通過索引引用它們。

如果您使用std::vector,則可以對它們編制索引,但必須使用std::find來獲取特定元素,該元素將爲O(n)。

但是,如果你需要一個索引來傳遞給其他東西,你可以使用一個指針。也就是說,使用一組來加快查找速度,並將指針(而不是索引)傳遞給特定的元素。