stl "вектор <T>слишком длинный" - PullRequest
0 голосов
/ 21 января 2012

я читал в других ответах, что компилятором c ++ нет ограничений максимальный размер std :: vector .я пытаюсь использовать вектор для одной цели, и мне нужно 10 ^ 19 элементов.

typedef struct{
  unsigned long price, weight;
}product;


//inside main
unsigned long long n = 930033404565174954;
vector<product> psorted(n);

программа прерывается на последнем утверждении.если я пытаюсь resize(n) вместо инициализации с n, то программа также прерывается с сообщением:

vector<T> too long
std::length_error at memory location

мне нужно отсортировать данные в соответствии с ценой после ввода вектора.что мне делать?

Ответы [ 2 ]

12 голосов
/ 21 января 2012

std::vector имеет ограничения на количество вещей, которые он может нести. Вы можете запросить это с помощью std::vector::max_size, который возвращает максимальный размер, который вы можете использовать.

10 ^ 19 наименований.

У вас есть 10^19 * sizeof(product) память? Я предполагаю, что у вас нет ~ 138 Exa байтов оперативной памяти. Кроме того, вам придется компилировать в 64-битном режиме, чтобы даже рассмотреть возможность выделения такого количества. Компилятор не ломается; ваше исполнение терпит неудачу за попытку выделить слишком много материала.

6 голосов
/ 21 января 2012

Другие уже говорили вам, в чем проблема. Одним из возможных решений является использование библиотеки STXXL , которая представляет собой реализацию STL, предназначенную для огромных наборов данных вне памяти.

Однако 10 ^ 19 8-байтовых элементов - это 80 миллионов ТБ. Я не уверен, что у кого-то есть такой большой диск ...

Кроме того, при условии, что пропускная способность диска составляет 300 МБ / с, на запись потребуется 8000 лет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...