Sergomen
@Sergomen
Просто делай добро и оно вернётся

Почему мой вектор не работает со строками?

Я пытаюсь реализовать свой вариант векторов(не обязательно правильный и тд. это я для лабы делаю).
И он работает как я хотел но только с типом string он почемуто не хочет работаь.
мой код
#include <iostream>
#include <cassert>
#include "colors.h"
using namespace std;

template <class T>
class vector{
  private:
    int length;
    T * arr, * temp;
    void clon(bool a_to_t = true){
        if (a_to_t)
            for(int i = 0; i < length; i++)
                    temp[i] = arr[i];
        else
            for(int i = 0; i < length; i++)
                    arr[i] = temp[i];
    }
    void log(){
        cout << "length :" << length << endl;
        (arr != nullptr) ? cout << "arr[0]:" << arr[0] << endl : cout<<endl;
        (temp != nullptr) ? cout << "temp[0]:" << arr[0] << endl : cout<<endl;
    }
  public: 
    vector(){
        length = 0; 
        arr = nullptr;
        temp = nullptr;
    }
    vector(int l){
        length = l;
        arr = new T[length];
        temp = nullptr;
    }
    ~vector(){
        delete[] arr, temp;
    }
    void pushBack(T value){
        length++;
        if(arr == nullptr){
            arr = new T[length];
            arr[0] = value;
            cout << 1 << endl;
            log(); // 1
        }
        else{
            cout << 2 << endl;
            log(); // 2
            temp = new T[length];
            cout << 3 << endl;
            log(); // 3
            clon();
            cout << 4 << endl;
            log(); // 4
            temp[length-1] = value;
            clon(false);
            cout << 5 << endl;
            log(); // 5
            delete[] temp;
            temp = nullptr;
        }
    }
    T& operator[](int i){
        try{
            if(i < 0)
                throw 1;
            if(i > length)
                throw 2;
            if(i == 0 && length == 0)
                throw 3;
            return arr[i];
        }
        catch(int a){
            bool nullSize = false;
            namespace c = colors;
            switch(a){
                case 1:
                    c::red("!Індекс не може бути меншим за 0");
                    cout<<endl;
                    break;
                case 2:
                    c::red("!Індекс більший за довжину масиву (");
                    c::yellow(length);
                    c::red(")");
                    cout<<endl;
                    break;
                case 3:
                    c::red("!У масиві нічого немає (");
                    cout<<endl;
                    nullSize = true;
                    break;
            }
            if(!nullSize){
                c::green("Я тобі дам перший елемент масиву:) "); 
                c::yellow(arr[0]);
                cout<<endl;
                return arr[0];
            }
            else{
                c::red("Я не знаю що тобі дати крім виходу з проги");
                cout<<endl;
                assert(!nullSize);
            }
        }
    }
};

int main(){
    system("chcp 65001");
    vector <string> obj;
    obj.pushBack("прикольно");
    obj.pushBack("правда?");
    obj.pushBack("правда?");
    obj.pushBack("правда?");
    cout << obj[0] << " " << obj[1] << endl;
    return 0;
}

Функция log срабтывает только до коментария // 3, а далше почемуто не работает.
1
length :1
arr[0]:прикольно

2
length :2
arr[0]:прикольно

3
length :2
arr[0]:прикольно
temp[0]:прикольно

Может с функцией clon что-то не так?
И в общем: что я делаю не так?
p.s. код был на немецком и я заменил его на нормальный. И также внес изменения по подсказке res2001
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
С clon все в принципе нормально. Можно конечно добавить std::move, но проблема не в этом.
Проблема в том, что у тебя массив arr размером length - 1, а temp - length. А в clon() ты пытаешься копировать length элементов из arr, поэтому происходит выход за пределы массива.
В PushBack делай инкремент length, только после того как вызовешь clon первый раз, но до второго вызова.

Жаль немецкий убрал, было забавно :-) Но так гораздо привычней и понятней.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы