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;

对于第二行和第三行,我收到以下警告:

警告 C4244:“参数”:从“__int64”转换为“无符号整数”,可能丢失数据

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

我正在使用 VS9 (2008)。

4

3 回答 3

8

也许STXXL库可以提供帮助:

STXXL 使用存储设备的抽象层提供 STL 替换,以实现数据结构的最佳布局。这允许在标准 C++ 数据结构中保存和操作多 TB 数据集,同时抽象化有效管理此行为的复杂性。STXXL 利用多磁盘 I/O 来加速 I/O 绑定计算。STXXL 是在卡尔斯鲁厄大学开发的。

于 2009-12-20T14:56:16.353 回答
2

您真的需要在向量中存储多个numeric_limits<unsigned int>::max()条目吗?哦

如果不是,那么只需将 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

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

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

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

于 2009-12-20T14:50:25.470 回答