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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

11.05.2013, 16:08. Просмотров 831. Ответов 13
Метки нет (Все метки)

Здорова господа!
Опять есть условие задачи:
Напишите такие классы, чтобы 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 использовались как стандартные контейнеры и что вообще понимается под этим стандартные контейнеры?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2013, 16:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс как стандартный контейнер (C++):

Стандартный векторный контейнер - C++
&quot;Обычно элементы создаются с помощью оператора new() и освобождаются с помощью оператора delete(), т.е. для создания нового элемента...

Приватный конструктор и стандартный контейнер. Два барана на мосту - C++
Всем суп! Итак, банальная вещь - в заголовке - не желает компилироваться. Суть, немного упрощённая, такова: class AAA { private: ...

Разработать класс-контейнер. Как тестировать? - C++
задали курсовую работу. (ниже файл) но я не могу понять что нужно сделать? к какому результату нужно прийти? в методических указаниях...

Стандартный класс stack: как вывести все его содержимое на экран - C++
Добрый день, в общем следующая проблема, работаю с шаблонным классом stack, хочу разобраться как вывести все его содержимое на экран или...

Как заполнить массив комплексными числами, не используя стандартный класс std::complex<double>? - C++
Короче, дана структура. Как заполнить массив комплексными числами, не используя стандартный класс std::complex&lt;double&gt;. struct...

Как создать класс контейнер-динамический массив и поместить туда объекты других классов? - C++
Какой тип массива использовать тип базового класса или наследников?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13205 / 7476 / 839
Регистрация: 27.09.2012
Сообщений: 18,373
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 16:10 #2
Цитата Сообщение от ninja2 Посмотреть сообщение
под этим стандартные контейнеры?
скорее всего аналог std::vector
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.05.2013, 19:07  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
скорее всего аналог std::vector
Так это мне тогда оказывается простое задание, скорее всего нужно просто написать два класса один как просто класс 6.2.1, а второй как бы реализующий интрузивный список 6.2.2 , просто по функциональности сделать как std::vector.

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

Не по теме:

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

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

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


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

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

Не по теме:

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

0
Croessmah
11.05.2013, 19:19
  #6

Не по теме:

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

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

Не по теме:

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

Не по теме:


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

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

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

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


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

Добавлено через 31 минуту
Ладно создаю два "СВОИХ" стандартных вектора, один просто в виде класса, а другой в виде производного от Container. А потом просто их оформлю в виде шаблона. Короче два легких задания, на 4-5 часов работы.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
11.05.2013, 20:18 #8
Напишите такие классы, чтобы Vector из 16.2.1 и Vector из 16.2.2 могли использоваться как стандартные контейнеры.
Переписать под использование с аллокатором, добавить нужные typedef-ы.
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.05.2013, 20:38  [ТС] #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Переписать под использование с аллокатором, добавить нужные typedef-ы.
Как под использование с аллокатором? Я так понимаю чтобы он был динамическим?
typedef-ы зачем добавлять - или это имеется typename под шаблон? ? ?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
11.05.2013, 20:40 #10
ninja2, Ну скорее динамическим, угу.
typedef-ы потому что так указано в стандарте, посмотрите в него.
1
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 21:36 #11
Цитата Сообщение от ninja2 Посмотреть сообщение
typedef-ы зачем добавлять
многие алгоритмы их используют, непросто так они в стандарте явно обозначены.
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.05.2013, 23:07  [ТС] #12
Ок сделаю с typedef-ами там то проблем, просто переопределить typename.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 23:25 #13
посмотри здесь что должно быть определено через typedef
Цитата Сообщение от ninja2 Посмотреть сообщение
Ок сделаю с typedef-ами там то проблем
в целом да, каких-либо сложностей там нет, просто полезно это знать, а понимать для чего это нужно - еще полезней
1
ninja2
231 / 187 / 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;
    }
};
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2013, 19:40
Привет! Вот еще темы с ответами:

Как сделать один универсальный класс-контейнер а-ля std::tuple из двух различных классов? - C++
Добрый день. Есть работающий код: #include &lt;iostream&gt; #include &lt;map&gt; enum Index { First, Second, ...

Стандартный класс complex. - C++
1)Есть ли стандартный не шаблонный класс complex? Я нашел только шаблонный класс, определенный в заголовочном файле &lt;complex&gt; Есть ли...

класс-контейнер - C++
ArrayList — реализует интерфейс List. Как известно, в Java массивы имеют фиксированную длину, и после того как массив создан, он не может...

Класс-Контейнер Вектор - C++
Как подсчитать в векторе количество максимальных элементов?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.05.2013, 19:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru