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

class Class1 {

    public:

        boost::ptr_vector<Class2> fields;
}

class Class2 {

    public:

        std:string name;
        unsigned int value;
}

我想在Class1中编写一个成员函数,该函数基于class2的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()中的时间太长(从容器的开始启动时aboost::ptr_vector<>太慢)
(2.)我需要保留字段的插入顺序(因此不能直接使用aboost::ptr_map<>
我发现了Boost::MultiIndex,它似乎可以提供解决问题的方法,但是我需要使用智能容器,这样容器的破坏也会破坏容器拥有的对象。
有没有实现一个具有多种访问方法的智能容器?

最佳答案

你可以用两个容器。有一个存储实际数据的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中查找它),同时保留插入顺序(只需在by_order中查找它)。

10-07 14:25