C ++ создает расширяемый массив с использованием указателей

0

Учитывая такую структуру, как я могу создать расширяемый (векторный) массив?

struct IntArray {
   int size;
   int capacity;
   int *contents;
};

Я думал об использовании содержимого int *, чтобы указать на массив целых чисел и просто изменить указатель по мере того, как IntArray расширяется, но как я узнаю, какой размер сделать мой первоначальный массив целых чисел?

Теги:

1 ответ

1

Как сказал @aaronman, вам было бы нехорошо, если бы мы просто дали вам окончательное решение: если вы хотите что-то узнать, лучше попробовать это самостоятельно с нуля (иначе просто используйте существующий std::vector или QVector или любой другой вектор).

Поэтому вместо этого я предлагаю вам увидеть некоторые уроки или некоторые примеры для вдохновения, а затем начать с нуля. Даже простой поиск google для c++ учебника, реализующего динамический массив, даст некоторые терпимые видео, подобные этому, а также некоторые текстовые ссылки.

После того как вы поняли детали реализации, вам может понадобиться создать интерфейс вашего массива, а точки, которые следует учитывать, могут быть следующими:

  1. Создайте class вместо struct чтобы поля были приватными по умолчанию (инкапсуляция)
  2. Внедрить начальное распределение в конструкторе и де-распределение в дескрипторе (см. Комментарий @juanchopanza). Копировать конструктор и оператор присваивания также хороши, но IMHO можно опустить в этот момент (например, вы можете сделать их частными без реализации, чтобы просто запретить копирование)
  3. Внедрите все свои функции как методы, например, метод push_back может добавить к концу. Вы увидите, что добавление элемента может привести к перераспределению, поэтому было бы неплохо извлечь процесс перераспределения в другой (возможно, частный) метод (чтобы сделать его повторно используемым) и реализовать его с помощью идей из этого видео, а затем вызвать его из push_back если size == capacity.
  4. Узнайте о перегрузке оператора и реализуйте оператор [], чтобы иметь доступ к элементам, как в обычном массиве.
  5. ... Продолжайте добавлять функциональность, пока не получите удовольствие от реализации :) Я думаю, что это важно, когда вы научитесь получать удовольствие от создания чего-то опрятного.

Наконец, вы можете сравнить свою реализацию с std::vector или каким-либо другим существующим динамическим массивом, чтобы узнать, не хватает ли вы чего-то. Примерно три года назад мне пришлось сделать собственную реализацию вектора в моей дипломной работе (для тонкого контроля за его модификацией и перераспределением по соображениям производительности), вы также можете проверить это, но (отказ от ответственности!) Вы можете обнаружить, что это довольно сложно и беспорядочно после всех моих попыток оптимизации :)

Преуспевать! Надеюсь, что это поможет (и немного вдохновляет вас).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню