2017-01-10 8 views
0

Учитывая следующий код:C++ Vector <int> массив инициализации

vector<int> A[1000000]; 
for(int i = 0; i < 1000000; i++){ 
    A[i].clear(); 
} 

Я бегу это на автоматизированный терминал, который имеет тестовые примеры работать с моим кодом, так что я не могу получить полные отладочные сообщения. Я не получаю никаких ошибок, и программа, похоже, работает нормально с отдельными тестовыми примерами. Однако, когда я бегу против полного набора, я принимаю/отказываюсь от тестовых случаев случайно (один раз я могу передать первые 3, другой я пропускаю все, кроме них, другой я пропускаю только второй и т. Д.). Я хочу убедиться, что эта инициализация избавится от «неопределенных» значений в массиве (например, char *buffer = new char[100]; buffer[0] = 0;), так что это не является причиной случайных сбоев.

sizeof(A) == 24000000 (~ 23MB), sizeof(int) == 4. Я добавляю только до 1 миллиона целых чисел к этим векторам (в целом), поэтому в худших тестах каждый вектор может быть одним элементом вектора, или один вектор может иметь 1 миллион целых чисел, а остальное остается пустым.

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

+1

Этот код ОК, там может быть ошибка в другом месте. Или переполнение стека –

+0

Вы пробовали, 'vector A (1000000,0);'? Это заполнит вектор нулями. – tinstaafl

+0

@tinstaafl, который является единственным вектором, OP-код делает миллион векторов (который, как я полагаю, преднамерен) –

ответ

6

Я думаю, что это переполнение стека, как предположил М.М. Линия

std::vector<int> A[1000000]; 

Создает миллион векторных объектов в стеке, что слишком много. На моей машине пример не удался для миллиона векторов, но он работал отлично на тысячу.

+0

Вы уверены? sizeof (A) возвращает мне 24000000, то есть только 23 МБ я добавлю только 1 миллион целых чисел к этим векторам (в целом), поэтому каждый вектор может быть вектором одного элемента, или один вектор может иметь 1 миллион, а остальное остается пустой. – gia

+0

Размер стека по умолчанию в Visual Studio, например, составляет 1 МБ. Создайте свой массив векторов в куче, используя вместо этого 'новый'. – Ari0nhh

+1

не использовать 'new' ... вектор векторов, или' unique_ptr' векторного массива были бы предпочтительнее –

0

В месте для использования петли ниже кода

std::fill(A.begin(), A.end(), 0); 

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

  • Нет связанных вопросов^_^