私は現在、データ構造にアクセスする方法を変更している最中であり、ベクトルのベクトルの一般的なケースで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
、乱雑になり始めており、問題は解決したと思います。