gpt4 book ai didi

c++ - boost::ptr_vector 上的多索引

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:52 26 4
gpt4 key购买 nike

我在程序中有以下类(class)。

class Class1 {

public:

boost::ptr_vector<Class2> fields;
}

class Class2 {

public:

std:string name;
unsigned int value;
}

我想在Class1中写一个成员函数返回对 fields 中元素的引用或指针基于 Class2 的 name多变的。我不必关心容器中对象的生命周期。

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

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,它似乎可以提供解决问题的方法,但我需要使用一个智能容器,这样容器的破坏也会破坏容器拥有的对象。

有没有办法实现具有多种访问方式的智能容器?

最佳答案

您可以使用两个容器。有boost::ptr_map<>存储实际数据,然后有一个 std::vector<>存储指向 map 节点的指针。

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 中查找)。

关于c++ - boost::ptr_vector 上的多索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26496361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com