3

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

我的动机很简单;我想要缓存位置而不放弃我的接口。

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

4

2 回答 2

3

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

另一种选择是使用 Hinnant 的堆栈分配器和常规的std::vector,但是 MSVC++ 在编译它时遇到了一些麻烦。

于 2012-07-04T09:43:52.857 回答
0

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

于 2012-07-04T11:16:11.670 回答