Как я могу создать std :: vector с 64-битными индексами? - PullRequest
2 голосов
/ 20 декабря 2009

Я хочу создать большой 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» в «unsigned int», возможная потеря данных

Что мне не хватает? Я думал, что тип для operator[] и для конструктора размера должен быть от allocator::size_type.

Я использую VS9 (2008).

Ответы [ 3 ]

8 голосов
/ 20 декабря 2009

Может быть, может помочь библиотека STXXL :

STXXL обеспечивает замену STL используя слой абстракции для хранения устройства для обеспечения оптимального макет структур данных. это позволяет мульти-терабайтные наборы данных для держать и манипулировать в стандарте C ++ структуры данных, в то время как абстрагирование от сложности управления это поведение эффективно. STXXL использует многодисковый ввод / вывод для ускорения Расчет ввода / вывода. STXXL был разработан в университете Карлсруэ.

2 голосов
/ 20 декабря 2009

Реализация вектора, предоставляемая вашим компилятором, уже использует самый большой целочисленный тип, который он может использовать [*], обычно size_t. Предположим, вы находитесь на машине с 32-битным адресным пространством и говорите, что хотите вектор с 2 ^ 33 элементами. Нет никакого способа, которым это может быть выделено, и изменение типа параметра operator[] не даст вашему компьютеру возможность выделять большие блоки памяти.

Итак, убедитесь, что вы компилируете свой код для 64-битной Windows, и все должно быть хорошо.

[*] Это не гарантируется стандартом. Но авторам компиляторов на самом деле не нравится устанавливать ограничения без причины, даже если иногда это выглядит так.

2 голосов
/ 20 декабря 2009

Вам действительно нужно хранить более numeric_limits<unsigned int>::max() записей в векторе? O.o

Если нет, просто приведите n-1 к int явно: int (n-1)

В любом случае, аргумент имеет тип vector::size_type (а не allocator :: size_type, насколько я знаю), который обычно является typedef для size_t (но не обязательно); это может быть 4 байта или 8 или другие суммы; это определенная реализация.

Также см. MSDN

...