具有两个索引(或复合索引)的容器

时间:2009-08-03 18:46:18

标签: c++ stl indexing

我有一个这样的课程

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

我计划将它存储在像

这样的STL容器中
vector<MyClass> myVector;

但我需要通过extenal Index(使用myVector[index])访问它;以及IdentifierContext的组合,在这种情况下,我会使用类似

的搜索执行搜索
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...
}

是否有更好的方法来存储或索引数据?

3 个答案:

答案 0 :(得分:2)

如果你能负担得起提升依赖性(仅限标题),

Boost::Multi-Index具有这个确切的功能。您可以使用random_access索引作为类似数组的索引,hashed_uniquehashed_non_uniqueordered_uniqueordered_non_unique(取决于您所需的特征)使用将标识符和上下文进行比较的仿函数。

答案 1 :(得分:1)

我们需要了解您的用法。 为什么您需要能够通过索引获取它们,以及您需要在容器中搜索特定元素的频率。

如果您将其存储在std::set中,则您的搜索时间为O(ln n),但您无法通过索引引用它们。

如果您使用std::vector,则可以对其进行索引,但必须使用std::find来获取特定元素,该元素将为O(n)。

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

答案 2 :(得分:0)

是的,但如果你想要速度,你需要牺牲空间。将其存储在标识符/上下文作为键的集合(如STL集)中,并同时将其存储在向量中。当然,您不需要数据本身的两个副本,因此使用智能指针(auto_ptr或variant)将其存储在集合中,并使用哑指针将其存储在向量中。