boost :: ptr_vector上的多索引

时间:2014-10-21 21:08:31

标签: c++ algorithm boost containers

我在一个程序中有以下类。

class Class1 {

    public:

        boost::ptr_vector<Class2> fields;
}

class Class2 {

    public:

        std:string name;
        unsigned int value;
}

我想在Class1中编写一个成员函数,该函数根据Class2&#39; fields变量返回name中元素的引用或指针。我不必担心容器中物体的使用寿命。

目前,在函数从向量的开头搜索到元素之后,我将向我想要的元素返回一个迭代器。

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 :: MultiIndex,似乎它可以提供问题的解决方案,但我需要使用智能容器,以便销毁容器也会破坏容器拥有的对象。

无论如何要实现具有多种访问方法的智能容器吗?

1 个答案:

答案 0 :(得分: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);
    }
}

这会在O(lg n)功能中为您提供getFieldByName()访问权限(只需在by_field中查找),同时还可以保留插入顺序(只需在{{1}中查找) })。