Quick actions

cmd+k|ctrl+k

Navigation

Languages

Lab 17

Snippet info

Language

Cpp

Visibility

public

Author

aldelank

Created

2017-12-27T16:58:56Z

Updated

2017-12-27T22:21:59Z

#include <iostream>
using namespace std;

class MyIntVector {
    //открытые методы класса (открытые функции-члены, интерфейс)
    public:
    //Конструктор инициализирует поля объекта
        MyIntVector (){
            length=0; capacity=1, dataPointer=new int[1]; 
        }
        MyIntVector (const MyIntVector &other){
            //return other;
            length=other.Length();
            capacity=other.Capacity();
            dataPointer=new int[capacity];
            for (int i=0;i<length;i++){
                dataPointer[i]=other[i];
            }
        }
        
        MyIntVector &operator= (const MyIntVector &other){
            length=other.Length();
            capacity=other.Capacity();
            dataPointer=new int[capacity];
            for (int i=0;i<length;i++){
                dataPointer[i]=other.At(i);
            }
            return *this;
        }
        
        const int &At (int index) const {
            return dataPointer [index];
        }
        
        ~MyIntVector (){//Пользовательсий деструктор
            free(dataPointer);
        } 
        void PushBack (int newElement){ //Метод добавляет новый элемент в конец вектора и увеличивает логическую длину на 1
            dataPointer[length]=newElement;
            length++;
            UpCapacity(length+1);
        } 
        int &operator[] (int index) const{ //Оператор получения ссылки на элемент вектора
            return dataPointer[index];
        }
        bool IsEmpty () const{return (length==0?true:false);} //Метод возвращает true, если логический размер равен 0
        int Length () const { return length; }//Метод возвращает логическую длину
        int Capacity () const {return capacity;} //Метод возвращает физическую длину
        
    private:
    //реализация
    //закрытые методы класса (закрытые функции-члены)
        void UpCapacity (int newCapacity){ //Метод увеличения размера блока памяти
            if (newCapacity>capacity) {
                int *newPointer=new int[newCapacity];
                for (int i=0;i<length;i++){
                    newPointer[i]=dataPointer[i];
                }
                dataPointer=newPointer;
            }
        }
        //поля класса (данные-члены)
        int length; //текущее логическое количество элементов вектора (логическая длина)
        int capacity; //количество элементов динамического блока памяти (физическая длина)
        int *dataPointer; //указатель на динамический блок памяти
};

void InputMyIntVector (MyIntVector &inVector, int n){
    for (int i=0;i<n;i++){
        int x; cin>>x;
        inVector.PushBack(x);
    }
}
void OutputMyIntVector (const MyIntVector &outVector){
    const int n=outVector.Length();
    for (int i=0;i<n;i++){
        cout<<outVector[i]<<" ";
    }
    cout<<endl;
}

template <class TypeOfElement>
class MyVector {
    //открытые методы класса (открытые функции-члены, интерфейс)
    public:
    //Конструктор инициализирует поля объекта
        MyVector (){
            length=0; capacity=1, dataPointer=new TypeOfElement[1]; 
        }
        MyVector (const MyIntVector &other){
            length=other.Length();
            capacity=other.Capacity();
            dataPointer=new TypeOfElement[capacity];
            for (int i=0;i<length;i++){
                dataPointer[i]=other[i];
            }
        }
        
        MyVector(TypeOfElement inputArray[], int inLength){
            SetSize(inLength);
            for (int i=0;i<inLength;i++){
                dataPointer[i]=inputArray[i];
            }
        }
        
        MyVector &operator= (const MyIntVector &other){
            //return other;
            if (this == &other) {
                return *this;
             }
            length=other.Length();
            capacity=other.Capacity();
            //cout<<length<<" "<<capacity<<" "<<endl;
            dataPointer=new TypeOfElement[capacity];
            for (int i=0;i<length;i++){
                dataPointer[i]=other[i];
            }
            //OutputMyVector(*this);
            return *this;
        }
        
        const int &At (int index) const {
            return dataPointer [index];
        }
        
        ~MyVector (){//Пользовательсий деструктор
            free(dataPointer);
        } 
        void PushBack (TypeOfElement newElement){ //Метод добавляет новый элемент в конец вектора и увеличивает логическую длину на 1
            dataPointer[length]=newElement;
            length++;
            UpCapacity(length+1);
        } 
        TypeOfElement &operator[] (int index) const{ //Оператор получения ссылки на элемент вектора
            return dataPointer[index];
        }
        bool IsEmpty () const{return (length==0?true:false);} //Метод возвращает true, если логический размер равен 0
        int Length () const { return length; }//Метод возвращает логическую длину
        int Capacity () const {return capacity;} //Метод возвращает физическую длину
        
        void SetSize (int n) {
            length=n;
            UpCapacity(length+1);
        }
        
         MyVector operator+ (const MyVector &left) const {
            MyVector <TypeOfElement> res(left);
            //OutputMyVector(*this);
            //(res);
            int len_old=res.Length();
            //cout<<len_old<<endl;
            res.SetSize(len_old+length);
            //cout<<res.Length()<<endl;
            for (int i=len_old;i<res.Length();i++){
                res[i]=dataPointer[i-len_old];
                //cout<<res[i]<<" ";
            }
            //cout<<endl;
            //OutputMyVector(res);
            return res;
        }
        
    private:
    //реализация
    //закрытые методы класса (закрытые функции-члены)
        void UpCapacity (int newCapacity){ //Метод увеличения размера блока памяти
            if (newCapacity>capacity) {
                TypeOfElement *newPointer=new TypeOfElement[newCapacity];
                for (int i=0;i<length;i++){
                    newPointer[i]=dataPointer[i];
                }
                dataPointer=newPointer;
            }
        }
        //поля класса (данные-члены)
        int length; //текущее логическое количество элементов вектора (логическая длина)
        int capacity; //количество элементов динамического блока памяти (физическая длина)
        TypeOfElement *dataPointer; //указатель на динамический блок памяти
};

template <typename TypeOfElement>
void InputMyVector (MyVector <TypeOfElement> &inVector, int n){
    inVector.SetSize(n);
    for (int i=0;i<n;i++){
        //TypeOfElement x; cin>>x;
        //inVector.PushBack(x);
        cin>>inVector[i];
    }
}
template <typename TypeOfElement>
void OutputMyVector (const MyVector <TypeOfElement> &outVector){
    const int n=outVector.Length();
    for (int i=0;i<n;i++){
        cout<<outVector[i]<<" ";
    }
    cout<<endl;
}


template <class MyType>
void MySwap (MyType &element1, MyType & element2) {
    MyType element3 = element1;
    element1 = element2;
    element2 = element3;
}

/*template <typename TypeOfElement>
MyVector <TypeOfElement> operator+ (const MyVector <TypeOfElement> &first, const MyVector <TypeOfElement> &second) {
            int len_first=first.Length();
            int len_sec=second.Length();
            MyVector <TypeOfElement> res(first);
            //res->SetSize(len_first+len_sec);
            for (int i=len_first;i<len_first+len_sec;i++){
                res.PushBack(second[i]);
            }
            return res;
        }*/

int main() {
    
    /*MyIntVector *v=new MyIntVector();
    int n; cin>>n;
    InputMyIntVector(*v,n);
    
    MyIntVector *w=new MyIntVector();
    w=v;
    //InputMyIntVector(*w,n);
    
    //OutputMyIntVector(*v);
    //OutputMyIntVector(*w);
    
    //cout<<a<<' '<<b<<endl;
    
    char a='a',b='b';
    MySwap(a,b);
    cout<<a<<" "<<b<<endl;*/
    
    int n; cin>>n;
    //MyVector <char> chars,letters,all; 
    MyVector <char> *chars=new MyVector <char> ();
    InputMyVector(*chars,n);
    MyVector <char> *letters=new MyVector <char> ();
    //letters=chars;
    InputMyVector(*letters,n);
    //MySwap(chars,letters);
    MyVector <char> *all = new MyVector <char>(*letters+*chars);
    //OutputMyVector(*all);
    //all=letters;
    //OutputMyVector(*all);
    //OutputMyVector(*chars);
    //OutputMyVector(*letters);
    OutputMyVector(*all);
    
    /*int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    MyVector<int> vec(a, 10);
    OutputMyVector(vec);*/
    
    return 0;
}
INFO