C++ boost::ptr_向量上的多索引

C++ boost::ptr_向量上的多索引,c++,algorithm,boost,containers,C++,Algorithm,Boost,Containers,我在一个项目中有以下课程 class Class1 { public: boost::ptr_vector<Class2> fields; } class Class2 { public: std:string name; unsigned int value; } 我面临的问题是: 一,。我需要快速随机访问元素,否则程序在getFieldByName中的时间太长boost::ptr_向量在容器开头启动时太慢

我在一个项目中有以下课程

class Class1 {

    public:

        boost::ptr_vector<Class2> fields;
}

class Class2 {

    public:

        std:string name;
        unsigned int value;
}
我面临的问题是:

一,。我需要快速随机访问元素,否则程序在getFieldByName中的时间太长boost::ptr_向量在容器开头启动时太慢

二,。我需要保留字段的插入顺序,这样就不能直接使用boost::ptr_映射

我发现了Boost::MultiIndex,它似乎可以为这些问题提供解决方案,但我需要使用智能容器,这样销毁容器也会销毁容器所拥有的对象


是否要实现具有多种访问方法的智能容器?

您可以使用两个容器。有一个存储实际数据的boost::ptr_映射,然后有一个存储映射节点指针的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函数提供Olg n访问权限—只需在“按”字段中查找,同时保留插入顺序—只需按顺序查找。

取消对迭代器的引用。它返回的值是一个引用。返回该值,也作为参考。@Brent我肯定会在我的最后一个函数中这样做。我更关心的是快速访问数据和保留插入顺序哦,我明白了。您需要的是Ologn查找,而不是On。Barry的答案似乎很好。另外,这是:假设ptr_向量中的插入位于末尾,您可以使用地图对其进行索引,在推回之前将名称与偏移量大小配对。在地图中查找名称,并使用成对偏移量索引到向量中。删除会有点麻烦,因为您必须在删除点之后重新为元素编制索引。您不能做任何这样的事情,因为ptr_map和ptr_vector都拥有它们的元素数据。对不起,std::vector代表节点的正确值。那真的值得投反对票吗?我不明白为什么不值得。这是大量的挥手行为,而且出于我指出的原因,这也是不正确的。有更多的评论merit@Barry当前位置也许将其编辑到答案中,使其至少不会明显错误,这样至少会有一些机会取消反对票。
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);
    }
}