1

Тема: Персональний вектор

Доброго дня усім!:)
Я новенька на цьому форумі. Тому хочу дізнатись як тут і що.
Але щоб не приходити з порожніми руками - ось вам мій варіант реалізації шаблонного класу vector.
Тут ще є недоліки, які я виправлю, коли в мене буде більше часу.
Критика вітається!


#pragma once
#ifndef _INT_ARRAY_
#define _INT_ARRAY_
#include <stdexcept>
#include <algorithm> 
 
template <typename T> class CustomVector
{
    struct storage
    {
        storage() : mas(0), capacity(0), size(0){}
        T* mas;
        size_t capacity;
        size_t size;
    };

    storage mStorage;

public:
    
    ~CustomVector()
    {
        delete [] mStorage.mas;
    }
 
    CustomVector()
    {
    }

    CustomVector(const CustomVector<T>& in)
    {
        mStorage.size = in.mStorage.size;
        mStorage.capacity = in.mStorage.capacity;
        mStorage.mas = new T[ mStorage.capacity];
        for (int i = 0; i < mStorage.size; ++i)
             mStorage.mas[i] = in.mStorage.mas[i];
    }

    explicit CustomVector(const size_t aSize, const T val = 0)
    {
        mStorage.mas = new T[aSize];
        mStorage.size = aSize;
        mStorage.capacity = aSize;
        for (int i = 0; i < mStorage.size; ++i)
             mStorage.mas[i] = val;
    }

    size_t getSize() const
    {
        return mStorage.size;
    }
 
    size_t getCapacity() const
    {
        return mStorage.capacity;
    }
 
    void reserve(size_t n)
    {
        if (n > mStorage.capacity)
        {
            T *temp = new T[n];
            mStorage.capacity = n;
            for (int i = 0; i < mStorage.size; ++i)
               temp[i] = mStorage.mas[i];
            delete []mStorage.mas;
            mStorage.mas = temp;
        }
    }
 
    void resize(size_t n)
    {
        if (mStorage.size > n)
        {
            mStorage.size = n;
            return;
        }
        if (mStorage.size < n)
        {
            reserve(n);
            for (int i = mStorage.size; i < n; ++i)
                mStorage.mas[i].~T();
        }
    }
 
    void pushBack(T val)
    {
        if (mStorage.size >= mStorage.capacity)
        {
            size_t new_size = mStorage.size + 1;
            reserve(new_size + new_size / 2);
        }
        mStorage.mas[mStorage.size++] = val;
    }
 
    void popBack()
    {
        if (mStorage.size >= 1)
            --mStorage.size;
    }
 
    int& operator[] (size_t n)
    {
        return mStorage.mas[n];
    }
 
    const int& operator[] (size_t n) const
    {
        return mStorage.mas[n];
    }
 
    int& at(size_t n)
    {
        if (n >= mStorage.size)
            throw std::out_of_range("Index out of range!");
        return mStorage.mas[n];
    }
 
    CustomVector& operator= (CustomVector<T> in)
    {
        swap(in);
        return *this;
    }
 
    void swap(CustomVector<T>& in)
    {
        storage temp(*this);
        in.mStorage = mStorage;
        mStorage = temp;
    }
 
    void clear()
    {
        for (int i = 0; i < mStorage.size; ++i)
            mStorage.mas[i].~T();
        mStorage.size = 0;
    }
 
    void erase(size_t index)
    {
        if (index >= mStorage.size) 
            throw std::out_of_range("Index out of range!");
        --mStorage.size;
        for (int i = index; i < mStorage.size; ++i)
            mStorage.mas[i] = mStorage.mas[i + 1];
    }
 
    bool empty() const
    {
        return mStorage.size == 0;
    }
 
    int front() const
    {
        return mStorage.mas[0];
    }
 
    int back() const
    {
        return mStorage.mas[size-1];
    }
 
    int& front()
    {
        return mStorage.mas[0];
    }
 
    int& back()
    {
        return mStorage.mas[size-1];
    }
};

#endif

Всім дякую за увагу!:)

2

Re: Персональний вектор

Рядки 81-82 - типовий UB. Непотрібний, до того ж, з будь-якого боку.
Вітаю на форумі.

Подякували: Tamika_Tesla1

3

Re: Персональний вектор

Ласкаво просимо у хогварс! *THUMBSUP*

4

Re: Персональний вектор

Joker написав:

Ласкаво просимо у хогварс! *THUMBSUP*

О, то у вас тут ще й магія?))

5 Востаннє редагувалося Joker (23.07.2014 17:30:51)

Re: Персональний вектор

ну так чорному по білому написано - форум програмістів. програмістів = магів. Просто зашифровуємо для захисту від звичайних маглів.

6

Re: Персональний вектор

Ще трохи продивився. Ви ніби C++11 використовуєте, судячи з typename? Тоді маєте семантику зсуву (move semantics) реалізовувати, і правило п'яти. До речі, ви щось подібне намагаєтеся робити в swap, але якось половинчасто.
Захисник включення _INT_ARRAY_ якось дивно виглядає для файлу з єдиним класом CustomVector.
Ну і така ідея - при push_back треба додавати не 1 елемент, а збільшувати масив, скажімо, на 20%. Це значно збільшить ефективність цієї операції. Але це просто ідея.

Подякували: Joker, Tamika_Tesla2

7

Re: Персональний вектор

koala написав:

Ще трохи продивився. Ви ніби C++11 використовуєте, судячи з typename? Тоді маєте семантику зсуву (move semantics) реалізовувати, і правило п'яти. До речі, ви щось подібне намагаєтеся робити в swap, але якось половинчасто.
Захисник включення _INT_ARRAY_ якось дивно виглядає для файлу з єдиним класом CustomVector.
Ну і така ідея - при push_back треба додавати не 1 елемент, а збільшувати масив, скажімо, на 20%. Це значно збільшить ефективність цієї операції. Але це просто ідея.

typename - це не лише с++ 11.
Воно і до того було.:)

8

Re: Персональний вектор

Так, дійсно, перепрошую. А я все писав за старою звичкою class.