Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041

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

11.05.2013, 16:08. Показов 1781. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2013, 16:08
Ответы с готовыми решениями:

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

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

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

13
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 16:10
Цитата Сообщение от ninja2 Посмотреть сообщение
под этим стандартные контейнеры?
скорее всего аналог std::vector
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
11.05.2013, 19:07  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
скорее всего аналог std::vector
Так это мне тогда оказывается простое задание, скорее всего нужно просто написать два класса один как просто класс 6.2.1, а второй как бы реализующий интрузивный список 6.2.2 , просто по функциональности сделать как std::vector.

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

Не по теме:

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

1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
11.05.2013, 19:15  [ТС]
От еще одна вторая задачка

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


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

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

Не по теме:

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

0
11.05.2013, 19:19

Не по теме:

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

1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
11.05.2013, 20:00  [ТС]

Не по теме:

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

Не по теме:


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

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

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

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


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

Добавлено через 31 минуту
Ладно создаю два "СВОИХ" стандартных вектора, один просто в виде класса, а другой в виде производного от Container. А потом просто их оформлю в виде шаблона. Короче два легких задания, на 4-5 часов работы.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.05.2013, 20:18
Напишите такие классы, чтобы Vector из 16.2.1 и Vector из 16.2.2 могли использоваться как стандартные контейнеры.
Переписать под использование с аллокатором, добавить нужные typedef-ы.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
11.05.2013, 20:38  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
Переписать под использование с аллокатором, добавить нужные typedef-ы.
Как под использование с аллокатором? Я так понимаю чтобы он был динамическим?
typedef-ы зачем добавлять - или это имеется typename под шаблон? ? ?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.05.2013, 20:40
ninja2, Ну скорее динамическим, угу.
typedef-ы потому что так указано в стандарте, посмотрите в него.
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.05.2013, 21:36
Цитата Сообщение от ninja2 Посмотреть сообщение
typedef-ы зачем добавлять
многие алгоритмы их используют, непросто так они в стандарте явно обозначены.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
11.05.2013, 23:07  [ТС]
Ок сделаю с typedef-ами там то проблем, просто переопределить typename.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.05.2013, 23:25
посмотри здесь что должно быть определено через typedef
Цитата Сообщение от ninja2 Посмотреть сообщение
Ок сделаю с typedef-ами там то проблем
в целом да, каких-либо сложностей там нет, просто полезно это знать, а понимать для чего это нужно - еще полезней
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
12.05.2013, 19:40  [ТС]
Зацените я по быстрому сделал на скорую руку. Конечно функционал убогей чем в 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.05.2013, 19:40
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru