Пользовательская реализация STL std :: vector - PullRequest
0 голосов
/ 08 декабря 2011

Я пишу для платформы, которая не имеет встроенной STL, но поддерживает шаблоны

Я работаю над собственной реализацией std :: vector.

template<typename T> class Array
{
private:
    T * buffer;
    int count;
    int capacity;
public:
    Array() : buffer(0), count(0), capacit(0) { }
    ~Array() { if(buffer) delete[] buffer; }
    void IN_ANY Reserve(const int capacity)
    {
        if(capacity >= count)
        {
            T * newBuff = new T[capacity];
            if(capacity > count)
                memset(newBuff+count, 0, (capacity-count) * sizeof(T));
            memcpy(newBuff, buffer, count * sizeof(T));

            if(buffer)
                delete [] buffer;

            buffer = newBuff;
            this->capacity = capacity;
        }
    }
    // Other methods...
}

Проблема возникает, когда T имеет нетривальный конструктор, нетривальное разрушение и перегруженный оператор =.Затем, при резервировании дополнительной памяти для массива, будут вызваны деструкторы для T, а не для конструкторов.Но не конструктор копирования (так как я использовал memcpy).Как я могу улучшить Резервный метод?

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

Не катайся сам - пользуйся STLPort. http://sourceforge.net/projects/stlport/

Это бесплатная и очень переносимая реализация STL.

1 голос
/ 08 декабря 2011

Если вы действительно хотите знать, как реализовать большие части STL, возьмите книгу «Библиотека стандартных шаблонов C ++» П. Дж. Плаугера, Александра Степанова, Мэн Ли и Дэвида Р. Муссера.* Наряду с использованием и интерпретацией некоторых стандартов также рассматриваются способы реализации больших частей STL.Это довольно старая книга, но очень интересно посмотреть, что происходит под обложками.

Если вы не очень хотите знать, как это сделать, а больше просто хотите, чтобы это было сделано, используйте одиниз других ответов о просмотре проектов Source Forge.

0 голосов
/ 08 декабря 2011

Ответ, который я искал, это новое место размещения

...