2014-11-08 2 views
1

Моя цель - создать массив кучи (с объемом 10 целых чисел для каждого вектора). Я могу создать свой массив достаточно легко:Инициализация массивов векторов в куче, C++

vector<int>* test = new vector<int>[NUM_VERTS]; 

Однако это создает массив пустых векторов. Я знаю, что в каждом векторе будет храниться не менее 10 целых чисел, поэтому я хочу создать векторы размером 10 для начала, чтобы избежать повторного их размера несколько раз (я читаю в большом файле и поэтому эффективность важна). Как я могу изменить сказанное выше, чтобы оно делало то, что я хочу?

Как примечание, я использую VS 2013 и борюсь с его отладчиком. Когда я запускаю отладчик и просматриваю содержимое test выше, он показывает мне адрес памяти области, на которую указывает, но не содержимое, хранящееся по адресу. Кто-нибудь знает, как я могу просматривать содержимое вместо адреса?

Благодаря

PS Я создаю массив векторов в куче, вместо стека, так как массив очень большой (чуть менее миллиона записей). Когда я попытался создать его в стеке, я получил ошибку переполнения стека.

+0

Динамическое выделение 'vector' очень необычно, и выполнение этого для массива из них практически неслыханно. Используйте 'vector > test;' или, может быть, 'array , NUM_VERTS> test;' если 'NUM_VERTS' известно во время компиляции. – Praetorian

+0

@Praetorian Причина, по которой я использую массив векторов, состоит в том, что я думал, что это будет быстрее, чем использование вектора векторов. Как я уже упоминал, файл, который я читаю, действительно большой, и поэтому я хочу быть максимально эффективным. – Adam

+1

Когда вы используете 'new []' operator для выделения памяти, единственным конструктором, который может использоваться для инициализации объектов, является конструктор по умолчанию. –

ответ

2

Вы можете создать vector из vector с, что не то же самое, как массив, но и для вашего случая использования он должен быть эквивалентен:

std::vector< std::vector<int> > test(NUM_VERTS, std::vector<int>(10)); 

нет необходимости выделять его новым, потому что vector элементы уже на куче.

Если вам нужен указатель на первый содержащийся вектор, вы можете просто использовать

std::vector<int> *p = &test[0]; 

и использовать p, как если бы это была куча распределённой массив векторов (все элементы vector гарантированно последовательно в памяти).

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