Как работать с гибкими массивами в C ++ - PullRequest
0 голосов
/ 26 февраля 2019

Контекст

Поэтому я поигрался с массивами в C / C ++, пытаясь создать массивы, которые могли бы динамически добавлять и удалять их элементы.

КонечноЯ подумал, что функция гибкого элемента массива в C будет подходящим способом.Поэтому я начал экспериментировать, как показано в приведенном ниже коде:

#include <cstdio> // printing stuff
#include <stdlib.h> // memory allocation stuff

// The array type
template <typename structType>
struct Array {
    private:
        // The structure containing the F.A.M.
        struct ArrayStructure { size_t length = 0; structType array[]; }
            *arrayStructurePointer, arrayStructure;
        constexpr inline static void add() {}

    public:
        // Constructor
        template <typename... types, typename = structType>
        explicit Array(types... elements) {
            this -> arrayStructurePointer =
                (ArrayStructure*) malloc(sizeof(structType));
            this -> arrayStructurePointer = &(this -> arrayStructure);
            this -> add(elements...);
        }

        // Destructor
        ~Array() {
            free(this -> arrayStructurePointer);
            free(this -> arrayStructure.array);
        }

        // Add stuff to the array
        inline void add(structType element) {
            this -> arrayStructurePointer =
                (ArrayStructure*) realloc(this -> arrayStructurePointer, sizeof(this -> arrayStructure));
            this -> arrayStructurePointer = &(this -> arrayStructure);
            this -> arrayStructure.array[this -> arrayStructure.length] = element;
            this -> arrayStructure.length += 1;
        }
        template <typename... types, typename = structType>
        inline void add(structType element, types... elements) {
            this -> add(element);
            this -> add(elements...);
        }

        // Query an element in the array
        constexpr inline structType operator [](size_t index) { return *(this -> arrayStructure.array + index); }
};

int main(int argc, char* argv[]) {
    Array<int> array(1, 0, 1);

    printf("Array [0]: %i\n", array[0]);
    printf("Array [1]: %i\n", array[1]);
    printf("Array [2]: %i\n", array[2]);

    return 0;
}

Суть в том, чтобы я понял (возможно), как работает vector и с какими проблемами он связан.


Задача

Я только дошел до добавления элементов в массив, но даже с этим, когда я компилирую и запускаю код, который естьэта огромная задержка, когда программа заканчивается до ее выхода (и я предполагаю, что это из-за утечек памяти).


Вопрос

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

Как правильно построить динамические массивы? ИЛИ

Как мне построить мою собственную vector структуру? ИЛИ

Существуют ли какие-либо полезные ресурсы / PDF-файлы, в которых рассказывается, как создаются динамические массивы (или vector)?

1 Ответ

0 голосов
/ 26 февраля 2019

Просто используйте std::vector для массива переменной длины.Он решает эту проблему лучше и надежнее, чем ваше ручное решение в 999/1000 случаях.

...