2009-08-03 59 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)。

但是,如果你需要一个索引来传递给其他东西,你可以使用一个指针。也就是说,使用一组来加快查找速度,并将指针(而不是索引)传递给特定的元素。