如何创建64位索引的std :: vector?

时间:2009-12-20 14:38:51

标签: c++ visual-studio-2008 stl 64-bit allocator

我想创建一个 std::vector,因此operator[]应该收到long long而不是unsigned int,我尝试编写自己的分配器:< / p>

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;

我收到第二行和第三行的以下警告:

  

警告C4244:'参数':从'__int64'转换为'unsigned int',可能丢失数据

我错过了什么?我认为operator[]和大小构造函数的类型应该来自allocator::size_type

我正在使用VS9(2008)。

3 个答案:

答案 0 :(得分:8)

也许STXXL库可以提供帮助:

  

STXXL提供STL替换   使用抽象层进行存储   允许最佳的设备   数据结构的布局。这个   允许使用多TB的数据集   按标准进行操纵和操纵   C ++数据结构,同时   提取管理的复杂性   这种行为有效。 STXXL   利用多磁盘I / O加速   I / O绑定计算。 STXXL已经   在大学开发的   卡尔斯鲁厄。

答案 1 :(得分:2)

你真的需要在向量中存储超过numeric_limits<unsigned int>::max()个条目吗? O.o

如果没有,那么只需将n-1明确地转换为int:int(n-1)

无论如何,参数是类型vector::size_type(而不是我知道的分配器:: size_type),它通常是size_t的typedef(但不一定是);它可能是4个字节或8个或其他数量;它是实现定义。

另见MSDN

答案 2 :(得分:2)

随编译器提供的向量的实现已经使用了[*]有用的最大整数类型,通常是size_t。假设您在具有32位地址空间的计算机上,并且您说您想要一个具有2 ^ 33个元素的向量。没有办法可以分配,并且更改operator[]的参数类型不会让您的计算机能够分配更大的内存块。

因此,请确保您正在为64位Windows编译代码,并且一切都应该正常。

[*]标准不保证这一点。但编译器编写者实际上并不喜欢无缘无故地加入限制,即使它有时也是这样。