2

私は大きな ものを作りたいstd::vectorので、operator[]受け取るべきではlong longなくunsigned int、私は自分のアロケータを書いてみました:

template <typename T>
struct allocator64 : std::allocator<T> {
    typedef long long difference_type;
    typedef unsigned long long size_type;
};

しかし、私が次のことを試してみると:

long long n = 5;
std::vector<int, allocator64<int> > vec(n);
vec[n-1] = 2;

2行目と3行目に次の警告が表示されます。

警告C4244:'引数':'__int64'から'unsigned int'への変換、データが失われる可能性があります

私は何が欠けていますか?operator[]サイズコンストラクターの型と型はから来るべきだと思いましたallocator::size_type

VS9(2008)を使用しています。

4

3 に答える 3

8

STXXLライブラリが役立つかもしれません。

STXXL は、データ構造の最適なレイアウトを可能にするために、抽象化レイヤーを使用してストレージ デバイスに STL の置き換えを提供します。これにより、数テラバイトのデータセットを標準の C++ データ構造で保持および操作できると同時に、この動作を効率的に管理する複雑さを抽象化できます。STXXL はマルチディスク I/O を利用して、I/O バウンドの計算を高速化します。STXXL は、カールスルーエ大学で開発されました。

于 2009-12-20T14:56:16.353 に答える
2

numeric_limits<unsigned int>::max()本当にベクターにエントリ以上のものを保存する必要がありますか?Oo

そうでない場合は、n-1をintに明示的にキャストします。int(n-1)

とにかく、引数はタイプvector::size_type(私が知る限り、allocator :: size_typeではありません)であり、通常はsize_tに対するtypedefです(ただし、そうである必要はありません)。4バイトまたは8バイトまたはその他の量である可能性があります。実装定義です。

MSDNも参照してください

于 2009-12-20T14:41:45.470 に答える
2

コンパイラで提供されている vector の実装では、[*] できる最大の整数型 (通常は ) が既に使用されていますsize_t。32 ビットのアドレス空間を持つマシンを使用していて、2^33 要素のベクトルが必要だとします。割り当てる方法はありません。パラメーターの型を変更してもoperator[]、コンピューターはより大きなメモリ ブロックを割り当てることができません。

したがって、コードを 64 ビット Windows 用にコンパイルしていることを確認してください。すべてがうまくいくはずです。

[*] 規格では保証されていません。しかし、コンパイラの作成者は、実際には理由もなく制限を設けることを好みません。

于 2009-12-20T14:50:25.470 に答える