固定大小std :: vector

时间:2012-07-04 09:31:13

标签: c++ arrays vector stack

我目前正在改变访问数据结构的方式,我正在审查一般情况下矢量向量的两种解决方案之一。

我的动机很简单;我想要缓存局部性而不放弃我的接口。

我知道我的向量在编译时的最大大小,但它们并不总是达到最大值。常见情况约为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,但它开始变得混乱,我确信这已经解决了问题。

2 个答案:

答案 0 :(得分:2)

有关具有类似矢量接口的固定大小数据结构的几个选项,请参阅此link。特别是,boost::auto_buffereastl::fixed_vector似乎是您的代码的可行选项。

另一个替代方法是将Hinnant的stack allocator与常规std::vector一起使用,但是MSVC ++在编译时遇到了一些麻烦。

答案 1 :(得分:0)

Boost有一个用于此目的的MultiArray类。