3

私は現在、データ構造にアクセスする方法を変更している最中であり、ベクトルのベクトルの一般的なケースで2つの解決策のうちの1つを検討しています。

私のインセンティブは単純です。インターフェイスをあきらめずにキャッシュの局所性が必要です。

コンパイル時のベクトルの最大サイズはわかっていますが、常に最大サイズに達するとは限りません。一般的なケースは約80%であり、各ベクトルの合計サイズは比較的小さくなります。その最大値に達した場合、どこかのロジックでエラーが発生し、エラーをスローするようにします。

頭に浮かんだ最初の解決策は、std :: vectorでプールアロケータを使用することでした。これは良い考えのように見えましたが、少し面倒かもしれません。以前はアロケータを適切に使用していなかったので、解決策がよくわかりませんでした。私は所有者とは別にデータを保存するのが好きではないので、実装をできるだけ透過的にしたいと思っています。

2番目の解決策は、現時点ではうまく機能しますが、少しだけ整列させたいと思います。現時点では、次のようになります。

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 に答える