我目前正在改变访问数据结构的方式,我正在审查一般情况下矢量向量的两种解决方案之一。
我的动机很简单;我想要缓存局部性而不放弃我的接口。
我知道我的向量在编译时的最大大小,但它们并不总是达到最大值。常见情况约为80%,每个载体的总大小相对较小。 如果我达到最大值,我在某处出现了逻辑错误,并希望它抛出错误。
首先想到的解决方案是使用带有std :: vector的Pool分配器,这似乎是一个好主意,但可能有点凌乱;以前没有正确使用过分配器,我不太确定解决方案。我不太喜欢将数据分开存储给它的所有者,我希望实现尽可能透明。
目前,第二种解决方案对我来说非常有用,但我想让它更符合要求。目前,它是:
class Foo {
public:
std::array<Bar, 10> bars;
size_t used;
// std::vector<Bar> bars; // reserved to 10... maybe
void add(int var1, int var2) {
if (used >= bars.size()) throw "Error";
bars[used] = Bar(var1, var2);
++used;
// std::vector alternative
// bars.push_back(Bar(var1, var2));
}
void remove(size_t idx) {
bars[idx] = bars.back();
--used;
// bars.back().~Bar(); // should happen, not sure if safe
// std::vector alternative
// bars[idx] = bars.back();
// bars.pop_back();
}
}
如上所述,效果很好。但是,如果我想将此解决方案移到别处,我宁愿不必再次实现它,并且在破坏方面具有适当的语义(类似于实际向量)。
所以,我想知道一个好的解决方案是什么?目前,我已经开始包装std::array
,但它开始变得混乱,我确信这已经解决了问题。
答案 0 :(得分:2)
有关具有类似矢量接口的固定大小数据结构的几个选项,请参阅此link。特别是,boost::auto_buffer
和eastl::fixed_vector
似乎是您的代码的可行选项。
另一个替代方法是将Hinnant的stack allocator与常规std::vector
一起使用,但是MSVC ++在编译时遇到了一些麻烦。
答案 1 :(得分:0)
Boost有一个用于此目的的MultiArray类。