我在一个程序中有以下类。
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,似乎它可以提供问题的解决方案,但我需要使用智能容器,以便销毁容器也会破坏容器拥有的对象。
无论如何要实现具有多种访问方法的智能容器吗?
答案 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}中查找) })。