我目前正在更改访问数据结构的方式,并且正在审查向量向量的一般情况下的两种解决方案之一。
我的动机很简单;我想要缓存位置而不放弃我的接口。
我在编译时知道我的向量的最大大小,但它们并不总是达到最大值。常见的情况是80%左右,每个向量的总大小要比较小。如果我达到那个最大值,我在某处的逻辑上犯了错误,并希望它抛出一个错误。
想到的第一个解决方案是使用带有 std::vector 的池分配器,这似乎是个好主意,但可能有点混乱;之前没有正确使用分配器,我不太确定解决方案。我不太喜欢将数据与其所有者分开存储,我希望实现尽可能透明。
第二种解决方案目前对我来说很有效,但我想让它不那么符合要求。目前,它是这样的:
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
,但它开始变得凌乱,我确信这是已解决的问题。