我在一个程序中有以下的类。
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.)我需要保留字段的插入顺序(因此不能直接使用a
boost::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
中查找它)。