0

リストの要素が連続して格納されないという点で、リストに似た STL コンテナーはありますか? このコンテナーのサイズは最大 1000x1000 要素で、各要素は 36 個の double を含むベクトルです。これをまとめて保存するには大きなチャンクになります (約 200 メガバイトなど)。代わりに、コンテンツへのポインタを別のベクトルとして格納するバリアントはありますか?これにより、ランダム アクセスが可能になります。このための STL コンテナー クラスは既に存在していますか、それともポインターを手動で保存する必要がありますか?

私が必要とするコンテナは実際には一定のサイズなので、自分で実装するのはそれほど難しくないと思いますが、STL コンテナが既に存在するかどうか疑問に思っていました。リストが大きく、コンテンツが中サイズになるため、ベクターは避けたいと思います。コンテナー内のベクトルが隣り合わせに存在する必要がない場合は、フラグメンテーションによるメモリ不足を防ぐために、リスト内でそれらを分離する方がよいのではないでしょうか?

4

3 に答える 3

1

と の両方deque<array<double, 36>>vector<vector<double>>使用すると、非常に大きな連続した割り当てを行う必要がなくなります。

それらのvector<vector<double>>点で悪いです。指定した数値については、 の連続した割り当てが必要です1000*1000*sizeof(vector<double>)。これは 10 MB 未満です (ほとんどの場合、avectorは 3 つのポインターのサイズです)。「適切なコンピューター」 (デスクトップまたはサーバー) では、これが問題になることはめったにありません。断片化の理由 (仮想アドレス空間が小さい、または仮想アドレス指定がまったくない) が懸念される場所では、とにかく 300MB っぽい RAM がないというより根本的な問題がある可能性もあります。ただし、合計 300MB を割り当てることができても、連続して 12MB を割り当てることができない環境が明らかに存在する可能性があるため、それを回避することで非常に安全にプレイできます。

std::arrayC++03 にはありませんがboost::array、36 個の double を表すクラスはあります。または簡単に作成できます。

vector<array<double, 36>>断片化の影響が最も大きく、連続した 250 MB の割り当てが必要です。個人的には、「これまでに直面する可能性のある最悪のメモリ断片化」のテストをシミュレートするのは簡単ではありませんが、私は最高のテスターではありません。このサイズのブロックは、32 ビット プロセスで少し不安を感じ始める程度ですが、条件が良ければ問題なく動作します。

于 2012-09-24T16:54:11.110 に答える
0

std::arrayクラスを利用することを強くお勧めします。サイズは一定で、すべての要素へのランダム アクセスをサポートし、iterator, const_iterator, reverse_iterator, const_reverse_iterator. 詳細: http://www.cplusplus.com/reference/stl/array/

于 2012-09-24T16:16:34.763 に答える
0

あなたのどのような特徴が正確に求められているかは明らかではありませんstd::list<T>。要素を追加または削除するときに要素が配置されたままになるコンテナーが必要な場合は、以下を参照してくださいstd::deque<T>。前面または背面で要素を追加/削除する場合、他のすべての要素は同じ場所に留まります。つまり、要素が途中で追加または削除されない限り、要素へのポインターと参照は有効なままです。イテレータは、挿入または削除時に無効になります。std::deque<T>ランダム アクセスを提供します。

要素が配置されたまま、任意の位置でランダム アクセスとサポートの追加/削除が直接与えられるコンテナーはありません。ただし、他の人が指摘したように、ポインターのコンテナーを使用すると、そのようなインターフェイスが提供されます。ポインターの使用を隠すためにラップする必要がある場合があります。

于 2012-09-24T17:03:16.063 に答える