Можно ли изменить размер массива 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 целых числа. Так что это не изменение размера. Что я хочу знать-можно ли изменить размер массивов после их инициализации?
Edit: как бы я реализовал вектор? Я не понимаю, как использовать итераторы в цикле перебрать и скопировать значения.
6 ответов
массивы C++ фиксированы по размеру.
Если вам нужен "изменяемый массив", вы захотите использовать std:: vector вместо массива.
мой совет еще сильнее: используйте std::vector<>
(et. Эл.) если у вас нет очень веской причины использовать массив C-style. Поскольку вы изучаете c++, я сомневаюсь, что у вас есть такая причина: использовать std::vector<>
.
Я бы также рекомендовал std::vector
. Однако, если вы застряли с массивом, вы всегда можете malloc
память, а затем realloc
Если вам нужно сделать массив больше.
выполните поиск здесь на SO, есть информация о malloc
и realloc
.
Если вы хотите изменить размер массива, вы, вероятно, хотите использовать вектор, который может быть автоматически изменен.
вы можете использовать оператор [] с вектором так же, как в массиве. Вы можете реализовать это с помощью вектора примерно так (если вы хотите использовать больше векторных методов):
#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 (index) для добавления проверки границ к векторному доступу.
Если вы хотите знать, почему ваша первая мысль составлен, но, похоже, не работает:
когда вы опускаете скобки в if-statement:
if ((n % 2) != 0) int farray[halfelements + 1];
это точно так же, как если бы вы использовали их:
if ((n % 2) != 0) {
int farray[halfelements + 1];
}
таким образом, он делает "фаррей" правильного размера, а затем он сразу выходит из области видимости и исчезает, и вы остаетесь только с оригинальным.