2016-06-26 2 views
-1

Я пытаюсь реализовать хеш-таблицу, используя прямую адресацию, которая может содержать 7 цифр телефонных номеров и имен. Когда я устанавливаю размер вектора 9999999, ошибки нет, но программа настолько медленная и почти остановлена.Максимальное назначение размера вектора C++

std::vector <long long> myNumbers (9999999); 

ИЛИ

std::vector <long long> myNumbers; 
myNumbers.resize (9999999) 

Оба неудачу, есть способ, которым я могу это сделать?

+4

Ум, я думаю, вы не понимаете, как работает вектор. Размер вектора - сколько объектов он может содержать. Вы пытаетесь сделать свой вектор в состоянии содержать 9'999'999 переменных типа long. Если вы не знаете, сколько телефонных номеров вы хотите вставить, просто не изменяйте размер в начале. Он изменит размер после того, как вы поместите в него значения. Вы можете сохранить 7-значный номер телефона в одной переменной 'long long'. – Jezor

+1

Определите «застревание». Хотя гашение нескольких мегабайт памяти происходит не быстро (per-se), это тоже не слишком медленно. Конечно, не «застревать» медленно. –

ответ

2

Программа застревает в том, что она пытается выделить для вас много данных, как и в других комментариях.

Однако вектор, вероятно, не самая лучшая структура данных для ваших данных. Если вы храните телефонные номера, это означает, что все ваши данные будут находиться между 1000000 и 9999999, поэтому, если вы используете массив или вектор, вы не используете все пространство, которое вы выделили. Используйте карту.

- EDIT

Тем не менее, если вы ожидаете, ваши данные будут действительно плотным, заполняя большинство 8,999,999 возможностей, с помощью массива может быть лучше, в конце концов. Вы можете использовать все пространство, создав массив размером 9 000 000 и получив индекс вставки/поиска, вычитая 1 000 000 из числа, эффективно переместив все числа на 1 000 000.

4

Когда вы используете std::vector<long long>(9999999), он должен инициализировать ~ 10M long long s. Предполагая, что каждый long long имеет длину 8 байтов, ваша программа должна обнулить 80 МБ памяти на месте. Это не мгновенно.

Вы уверены, что хотите использовать вектор 80 МБ? Звучит как std::unordered_map или std::map (в зависимости от того, нужны ли вам клавиши в порядке) - лучшая структура данных для использования.

Смежные вопросы