我想创建一个大 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)。
答案 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编译代码,并且一切都应该正常。
[*]标准不保证这一点。但编译器编写者实际上并不喜欢无缘无故地加入限制,即使它有时也是这样。