2009-04-16 4 views
7

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

int mergeSort() 
{ 
    const int n = 9; 
    int originalarray[n] = {1, 3, 5, 7, 9, 2, 4, 6, 8}; 


    const int halfelements = (sizeof(originalarray)/sizeof(int))/2; 
    int farray[halfelements]; 
    int sarray[halfelements]; 

    for (int i = 0; i < halfelements; i++) { 
     farray[i] = originalarray[i]; 
    } 

    for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
     sarray[x] = originalarray[i]; 
    } 

Я был назначен (я не беру классы - только обучение с несколькими друзьями помогает мне) алгоритм сортировки слиянием, причем алгоритм объяснил, но не реализация. Я хочу переписать это, чтобы он работал как для нечетных, так и для целых чисел. Я пробовал/а добавить код:

if ((n % 2) != 0) int farray[halfelements + 1]; 

Для того, чтобы использовать одно и то же целочисленное число для итерации по обоим последующим массивам. Значение sizeof (farray) показывает 16 байтов или 4 целых числа. Так что это не изменение размера. Что я хочу знать - возможно ли изменить размеры массивов после их инициализации?

Редактировать: Как реализовать вектор? Я не понимаю, как использовать итераторы в цикле для повторения и копирования значений.

ответ

16

C++ массивы имеют фиксированный размер.

Если вам нужен «изменяемый размер массива», вы должны использовать std::vector вместо массива.

+0

ОК, спасибо. Я понял, как вы бы ввели std :: vector в этот алгоритм.Хотя мне жаль, что я не потратил два часа на отладку своего кода, просто для того, чтобы выяснить, что мой заголовок функции «int mergeSort (std :: vector, int)» отсутствовал «» =/ – jkeys

+0

. динамическими массивами в любом случае? Динамическое изменение размера массива или вектора должно приводить к одинаковым штрафам за производительность. Right> – Jason

1

Если вы хотите изменить размер массива, вы, вероятно, захотите использовать вектор, который можно изменить автоматически.

4

Мой совет еще сильнее: используйте std::vector<> (и др.), Если у вас нет веских оснований для использования массива в стиле C. Поскольку вы изучаете C++, я сомневаюсь, что у вас есть такая причина: использовать std::vector<>.

+0

Учитывая, что вектор предназначен для использования непрерывного хранилища, даже при передаче методу, использующему указатель, вы можете использовать вектор. Только при передаче ссылки/указателя на указатель метода измерения данных вы застряли в использовании необработанной памяти. – Richard

1

Вы можете использовать оператор [] с вектором так же, как и в массиве. Вы могли бы реализовать это с помощью вектора-то вроде этого (если вы хотите использовать более векторные методы):

#include <vector> 

const int halfelements = originalarray.size()/2; //use size to get size 
vector <int> farray(halfelements); 
vector <int> farray(halfelements); 

for (int i = 0; i < halfelements; i++) { 
    farray.push_back(originalarray[i]); //adds element at i to the end of vector 
} 

for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
    sarray.push_back(originalarray[i]); 
} 

Вы также можете использовать .at (индекс), чтобы добавить проверку границ для доступа вектора.

+0

, пожалуйста, не используйте «pre» тег HTML для кода - вместо этого выберите код с помощью мыши и введите ctrl-K или щелкните значок кода. –

+0

Он должен использовать конструкторы vector (iter, iter). вектор отдаленный остров (оригиналarray.begin(), & оригинальныйarray [половина]), sarray (& originalarray [половина], originalarray.end()); После этого он удаляет копию. Но это, наверное, сбивает с толку. – jmucchiello

0

Если вы хотите знать, почему ваша первая идея составлен, но, похоже, не работает:

Если опустить скобки в Условный оператор:

if ((n % 2) != 0) int farray[halfelements + 1]; 

это так же, как если вы «d использовали их:

if ((n % 2) != 0) { 
    int farray[halfelements + 1]; 
} 

Так что, сделав„farray“правильного размера - а затем он сразу же выходит из области видимости и ушел, и вы остались только оригинал.

2

Я также рекомендую std::vector. Однако, если вы застряли с массивом, вы всегда можете получить память, а затем realloc, если вам нужно сделать массив крупнее.

Проведите поиск здесь, на SO, есть информация о malloc и realloc.

+0

Я тоже использую это соглашение. – Hydro

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