Можно ли изменить размер массива 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];
}

таким образом, он делает "фаррей" правильного размера, а затем он сразу выходит из области видимости и исчезает, и вы остаетесь только с оригинальным.