Форум программистов, компьютерный форум CyberForum.ru

Класс как стандартный контейнер - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.05.2013, 16:08     Класс как стандартный контейнер #1
Здорова господа!
Опять есть условие задачи:
Напишите такие классы, чтобы Vector из 16.2.1 и Vector из 16.2.2 могли использоваться как стандартные контейнеры.

От Vector из 16.2.1:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<class T>
class Vector//optimal6nui
{
public:
    T mass[30];
    int size;
    explicit Vector(size_t n):size(n){}//inicializaci9 n ob6ektami co znacheniem T()
 
    T& operator[](size_t n)//indekcaci9
    {
        if(n<=size&&n>=0)
            return mass[n];
    }
    
    T getSize(){return size;}
    //...
};
От Vector из 16.2.2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct Object
{
    Object* pre;
    Object* next;
    //...
public:
    //konctryktor po ymolchaniyu
    Object():pre(0),next(0){}
 
    //virtual6nui dectryktor
    virtual ~Object(){};
};
 
class Container : public Object
{
public:
    struct Bad_op//klacc icklyuchenii
    {
        const char* p;
        Bad_op(const char* pp):p(pp){}
    };
    
    virtual void put(Object*){throw Bad_op("put");}
    virtual Object* get() {throw Bad_op("get");}
    virtual Object*& operator[](int){throw Bad_op("[]");}
    
    //...
};
 
class Vector : public Container
{
public:
    Object*& operator[](size_t);
    //...
};

Я от никак не пойму как же сделать класс, чтобы Vectror использовались как стандартные контейнеры и что вообще понимается под этим стандартные контейнеры?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2013, 16:08     Класс как стандартный контейнер
Посмотрите здесь:

Класс-Контейнер Вектор C++
C++ Класс-Контейнер Вектор
C++ Стандартный класс complex.
класс-контейнер C++
Стандартный векторный контейнер C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 16:10     Класс как стандартный контейнер #2
Цитата Сообщение от ninja2 Посмотреть сообщение
под этим стандартные контейнеры?
скорее всего аналог std::vector
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.05.2013, 19:07  [ТС]     Класс как стандартный контейнер #3
Цитата Сообщение от Croessmah Посмотреть сообщение
скорее всего аналог std::vector
Так это мне тогда оказывается простое задание, скорее всего нужно просто написать два класса один как просто класс 6.2.1, а второй как бы реализующий интрузивный список 6.2.2 , просто по функциональности сделать как std::vector.

Да наверно так и сделаю, чтобы долго не думать.
Croessmah
11.05.2013, 19:08
  #4

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
Так это мне тогда оказывается простое задание
ага, особенно аллокаторы

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.05.2013, 19:15  [ТС]     Класс как стандартный контейнер #5
От еще одна вторая задачка

Напишите шаблон, реализующий контейнер с теми же функциями-членами и теми же типами, что и стандартный vector, для существующего (нестандартного) контейнерного типа. Не модифицируйте при этом существующий контейнерный тип. Как вы поступите с его функциональностью, не совпадающей со стандартной?


У меня тут просто немного вопросов возникло, что это за существующий (нестандартный) контейнерный тип? И что такое существующий контейнерный тип ( то есть наверно стандартный )
Я так от думаю стандартный это вектор из 16.2.1 выше есть пример кода. (просто как класс)
А не стандартный это вектор из 16.2.2 выше тоже есть пример, там с общим базовым классам Container. ???????????????????????????????????

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
ага, особенно аллокаторы
Аллокаторы я про них читал но ничо не понял, понял одно, что программисту про них знать не обязательно.

Croessmah
11.05.2013, 19:19
  #6

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
Аллокаторы я про них читал но ничо не понял, понял одно, что программисту про них знать не обязательно.
Ну вот когда будете писать шаблонный последовательный контейнер, тогда и задумаетесь над тем - нужно это знать или нет

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.05.2013, 20:00  [ТС]     Класс как стандартный контейнер #7

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:


Ну вот когда будете писать шаблонный последовательный контейнер, тогда и задумаетесь над тем - нужно это знать или нет

А что под шаблонным последовательным контейнером имеется в веду? Я уже его писал. Я там просто сделал на основе статического массиве на 1к элементов.

Ну я вроде понял, что имеется под аллокаторами - это просто механизм выделения памяти.

std::vector это конечно динамически у него выделяется память, но у меня была идея сделать в конструкторе выделение памяти под массив, но ничо не получилось, динамически массив вроде нельзя в классе создать, а от еще идея появилась в классе создать просто указатель на какой нить тип T* и затем уже в конструкторе при инициализации просто используя placement new с кучи выделить память и поделить под этот тип, как бы сымитировать массив, я просто пишу щас возможно и бред, потому что не разу так не делал для класса динамически не выделял память, обычно представление было в виде статического массива, чтобы голову не морочить.


Вообще то это по теме.

Добавлено через 31 минуту
Ладно создаю два "СВОИХ" стандартных вектора, один просто в виде класса, а другой в виде производного от Container. А потом просто их оформлю в виде шаблона. Короче два легких задания, на 4-5 часов работы.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.05.2013, 20:18     Класс как стандартный контейнер #8
Напишите такие классы, чтобы Vector из 16.2.1 и Vector из 16.2.2 могли использоваться как стандартные контейнеры.
Переписать под использование с аллокатором, добавить нужные typedef-ы.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.05.2013, 20:38  [ТС]     Класс как стандартный контейнер #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Переписать под использование с аллокатором, добавить нужные typedef-ы.
Как под использование с аллокатором? Я так понимаю чтобы он был динамическим?
typedef-ы зачем добавлять - или это имеется typename под шаблон? ? ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.05.2013, 20:40     Класс как стандартный контейнер #10
ninja2, Ну скорее динамическим, угу.
typedef-ы потому что так указано в стандарте, посмотрите в него.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.05.2013, 21:36     Класс как стандартный контейнер #11
Цитата Сообщение от ninja2 Посмотреть сообщение
typedef-ы зачем добавлять
многие алгоритмы их используют, непросто так они в стандарте явно обозначены.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.05.2013, 23:07  [ТС]     Класс как стандартный контейнер #12
Ок сделаю с typedef-ами там то проблем, просто переопределить typename.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.05.2013, 23:25     Класс как стандартный контейнер #13
посмотри здесь что должно быть определено через typedef
Цитата Сообщение от ninja2 Посмотреть сообщение
Ок сделаю с typedef-ами там то проблем
в целом да, каких-либо сложностей там нет, просто полезно это знать, а понимать для чего это нужно - еще полезней
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2013, 19:40     Класс как стандартный контейнер
Еще ссылки по теме:

C++ Приватный конструктор и стандартный контейнер. Два барана на мосту
C++ Разработать класс-контейнер. Как тестировать?
Стандартный класс stack: как вывести все его содержимое на экран C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
12.05.2013, 19:40  [ТС]     Класс как стандартный контейнер #14
Зацените я по быстрому сделал на скорую руку. Конечно функционал убогей чем в std::vector но все же, похож на стандартный вектор, сделал с аллокатором, осталось теперь вторую часть сделать добавить шаблон и typedef-ы и все, профессиональный настоящий класс готов. (хотя в задаче говорилось напишите классы, то есть несколько, я так думаю наверно нужно было и класс итератор создать, но ну его в баню , когда не будь создам мб ...)

Я от проверял все вроде работает как положено.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
class Vector
{
    int siz;
    int* mass;
 
public:
    //class icklyuchenii
    class out_of_range{};
 
    //konctrykotr preobrazovani9
    Vector(int s):siz(s){mass=new int[s];}
    
    //konctryktor kopirovani9
    Vector(Vector& v):siz(v.siz)
    {
        mass=new int[v.siz];
        for(int i=0;i<siz;i++)
            mass[i]=v[i];
    }
    
    //vozvrat razmera size
    int size(){return siz;}
 
    //doctyp bez proverki
    int& operator[](int i){return mass[i];}
    const int& operator[](int i)const{return mass[i];}
 
    //doctyp c proverkoi
    int& at(int i)
    {
        if(i>=0&&i<siz)
            return mass[i];
        else
            throw out_of_range();
    }
 
    const int& at(int i)const
    {
        if(i>=0&&i<siz)
            return mass[i];
        else
            throw out_of_range();
    }
 
    //front() vozvrat pervogo elementa
    int& front(){return mass[0];}
    const int& front()const {return mass[0];}
 
    //vozvrat poclednego elementa
    int& back(){return mass[siz-1];}
    const int& back()const {return mass[siz-1];}
 
    //begin()
    int* begin(){return mass;}
    //end()
    int* end(){return mass+siz;}
 
    //ctekovue operacii
    //dobavlenie v konec
    void push_back(const int& x)
    {
        siz=siz+1;
        int* yk=new int[siz];
        for(int i=0;i<siz-1;i++)
            yk[i]=mass[i];
 
        int* del=mass;
        mass=yk;
        
        delete del;//vucvobojdenie pam9ti
        mass[siz-1]=x;
    }
 
    //vuvod Vector
    void print()
    {
        for(int i=0;i<siz;i++)
            cout <<mass[i]<<' ';
        cout <<endl;
    }
 
    //ydalenie poclednego elementa
    void pop_back()
    {
        if(siz==0)
            throw out_of_range();
 
        siz-=1;
        int* yk=new int[siz];//vudel9em mecto pod novui macciv
        for(int i=0;i<siz;i++)
        {
            yk[i]=mass[i];
        }
 
        int* del=mass;
        mass=yk;
        delete del;//ocvobojdenie pam9ti
    }
 
    //operacii xarakternue dl9 cpickov
 
    int* insert(int* ptr, int znach)
    {
        siz+=1;
        int* yk=new int[siz];
        //poick mecta
        for(int i=0,j=0;j<siz;i++,j++)
        {
            if((mass+i)==ptr)
            {
                //naideno mecto dl9 vctavki
                yk[j]=znach;
                ptr=yk+j;
                i--;
            }
            else
            {
                yk[j]=mass[i];
            }
        }
        int* del=mass;
        mass=yk;
        delete del;
        return ptr;
    }
 
    int* erase(int* ptr)
    {
        siz-=1;
        int* yk=new int[siz];
        //poick elementa dl9 ydaleni9
        for(int i=0,j=0;i<siz+1;i++,j++)
        {
            if((mass+i)==ptr)
            {
                ptr=yk+j;
                j--;
                continue;
            }
            else
            {
                yk[j]=mass[i];
            }
        }
 
        int* del=mass;
        mass=yk;
        delete del;
        return ptr;
    }
};
Добавлено через 1 минуту
хотел еще функцию clean() добавить да забыл, ну там сложности удалить все элементы я думаю нету.

Добавлено через 2 часа 7 минут
Я уже и шаблон примитивный сделал. Кто скажет что я про!?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
template <typename T>
class Vector
{
    int siz;
    T* mass;
 
public:
    typedef T* iter;
    typedef T& value;
 
    //class icklyuchenii
    class out_of_range{};
 
    //konctrykotr preobrazovani9
    Vector(int s):siz(s){mass=new T[s];}
    
    //konctryktor kopirovani9
    Vector(Vector& v):siz(v.siz)
    {
        mass=new T[v.siz];
        for(int i=0;i<siz;i++)
            mass[i]=v[i];
    }
    
    //vozvrat razmera size
    int size(){return siz;}
 
    //doctyp bez proverki
    value operator[](int i){return mass[i];}
    const T& operator[](int i)const{return mass[i];}
 
    //doctyp c proverkoi
    value at(int i)
    {
        if(i>=0&&i<siz)
            return mass[i];
        else
            throw out_of_range();
    }
 
    const value at(int i)const
    {
        if(i>=0&&i<siz)
            return mass[i];
        else
            throw out_of_range();
    }
 
    //front() vozvrat pervogo elementa
    value front(){return mass[0];}
    const T& front()const {return mass[0];}
 
    //vozvrat poclednego elementa
    value back(){return mass[siz-1];}
    const T& back()const {return mass[siz-1];}
 
    //begin()
    iter begin(){return mass;}
    //end()
    iter end(){return mass+siz;}
 
    //ctekovue operacii
    //dobavlenie v konec
    void push_back(const T& x)
    {
        siz=siz+1;
        T* yk=new T[siz];
        for(int i=0;i<siz-1;i++)
            yk[i]=mass[i];
 
        T* del=mass;
        mass=yk;
        
        delete del;//vucvobojdenie pam9ti
        mass[siz-1]=x;
    }
 
    //vuvod Vector
    void print()
    {
        for(int i=0;i<siz;i++)
            cout <<mass[i]<<' ';
        cout <<endl;
    }
 
    //ydalenie poclednego elementa
    void pop_back()
    {
        if(siz==0)
            throw out_of_range();
 
        siz-=1;
        T* yk=new T[siz];//vudel9em mecto pod novui macciv
        for(int i=0;i<siz;i++)
        {
            yk[i]=mass[i];
        }
 
        T* del=mass;
        mass=yk;
        delete del;//ocvobojdenie pam9ti
    }
 
    //operacii xarakternue dl9 cpickov
 
    iter insert(iter ptr, T znach)
    {
        siz+=1;
        T* yk=new T[siz];
        //poick mecta
        for(int i=0,j=0;j<siz;i++,j++)
        {
            if((mass+i)==ptr)
            {
                //naideno mecto dl9 vctavki
                yk[j]=znach;
                ptr=yk+j;
                i--;
            }
            else
            {
                yk[j]=mass[i];
            }
        }
        T* del=mass;
        mass=yk;
        delete del;
        return ptr;
    }
 
    iter erase(iter ptr)
    {
        siz-=1;
        int* yk=new int[siz];
        //poick elementa dl9 ydaleni9
        for(int i=0,j=0;i<siz+1;i++,j++)
        {
            if((mass+i)==ptr)
            {
                ptr=yk+j;
                j--;
                continue;
            }
            else
            {
                yk[j]=mass[i];
            }
        }
 
        T* del=mass;
        mass=yk;
        delete del;
        return ptr;
    }
};
Yandex
Объявления
12.05.2013, 19:40     Класс как стандартный контейнер
Ответ Создать тему
Опции темы

Текущее время: 23:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru