Можете ли вы resize массива 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 целых числа. Так что это не изменение размера. Что я хочу знать – возможно ли resizeы массивов после их инициализации?

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

Массивы C ++ фиксированы по размеру.

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

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

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

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

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

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

 #include  const int halfelements = originalarray.size()/2; //use size to get size vector  farray(halfelements); vector  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 (index), чтобы добавить проверку границ в векторный доступ.

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

Когда вы опускаете фигурные скобки в if-statement:

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

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

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

Таким образом, он создает «растояние» правильного размера – и затем он сразу выходит из сферы действия и уходит, и у вас остается только исходный.

  • Как resize шрифта JLabel, чтобы взять максимальный размер
  • Как узнать размер сеанса в ASP.NET из веб-приложения?
  • Разница между длинными и внутренними типами данных
  • Использование jQuery для получения размера windows просмотра
  • C # FileStream: оптимальный размер буфера для записи больших файлов?
  • Почему имена таблиц / столбцов / индексов Oracle ограничены 30 символами?
  • Как определить размер формы windows ACTUAL (со всеми неклиентными элементами) при запуске Aero?
  • Java / ImageIO получает размеры изображения без чтения всего файла?
  • Может кто-нибудь объяснить этот код шаблона, который дает мне размер массива?
  • Как я могу получить размер файла в C?
  • Почему расчетная ширина и высота в пикселе строки в Tkinter различаются между платформами?
  • Давайте будем гением компьютера.