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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
TheSoul
1 / 1 / 0
Регистрация: 29.12.2010
Сообщений: 17
#1

Реализация класса контейнер. - C++

13.06.2011, 00:10. Просмотров 1421. Ответов 10
Метки нет (Все метки)

Естественно, это нужно сделать без использования подключаемых библиотек.
Описать шаблон-класс нужно сначало. И затем программу, которая покажет все возможности этого щаблон-класса.

Первая мысль:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template < class TEntry, class TAllocator >
class TTinyArrayBase
 {
      // Начало массива
      TEntry* GetStart() const { return m_Data; }
      // Конец массива (указатель на элемент, следующий после последнего)
      TEntry* GetFinish() const { return (TEntry*)GetStorage()->Finish; }
      // Конец выделенного массива (указатель на элемент, следующий после последнего)
      TEntry* GetEndAllocated() const 
      { return (TEntry*)GetStorage()->Storage._M_data; }
      // Указатель на префикс с остальными параметрами массива
      TTinyArrayStorage<TAllocator> *GetStorage() const
      { return (TTinyArrayStorage<TAllocator>*)(((char *)m_Data) -
          sizeof(TTinyArrayStorage<TAllocator>)); }
      // Начало массива
      TEntry *m_Data;
 };
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2011, 00:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализация класса контейнер. (C++):

Создание контейнер класса - C++
Всем Привет! Возникает несколько вопросов при создании классов: 1) Какой C++ statement использовать, когда программа должна...

Реализация класса на базе класса Stack с возможностью !индексирования! - C++
Помогите пожалуйста!!! Нужно реализовать на базе класса stack другой класс с возможностью индексирования, а именно: Например 1 - й...

Контейнер Map. Использование класса как ключ - C++
class A{ int X;}; class B{ public: int y;}; int main() { A objA; B objB; map&lt;A,B&gt; m; m.y=1; //kak? ...

Разработать шаблон класса для хранения данных (контейнер) - C++
Я не понял как описать шаблон класса для хранения данных (контейнер). Данные должны хранится, например, в виде массива. Шаблон должен...

Создать контейнер класса с методами включения и удаления строки, очистки текста, подсчета количества символов - C++
Помогите создать контейнер класса который является абстракцией текста с методами включения и удаления строки из текста, очистки текста,...

Реализация класса - C++
Спроектировать и реализовать класс BigInt, позволяющий хранить целые числа в диапазоне , и производить набор основных операций с ними. ...

10
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
13.06.2011, 13:22 #2
Это набор законченных предложений и кусок какого-то шаблона, выдернутый из контекста. С какой целью это все написано?
0
TheSoul
1 / 1 / 0
Регистрация: 29.12.2010
Сообщений: 17
13.06.2011, 21:44  [ТС] #3
Есть задание реализовать контейнер. Тоесть описать его как класс, не подключая библиотеки. Вот и получается что 2 задачи. Описать класс контейнер затем связать его с программой, которая будет показывать возможности этого класса. Как описать класс для одного типа объектов это ясно. А вот хотелось бы его сделать универсальным. Там должен быть принципиально другой подход. Вот хотелось бы узнать, как это возможно сделать..
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2011, 23:10 #4
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
#include <iostream>
 
namespace my {
 
    template< class T >
    class vector;
 
    template< typename T >
    std::ostream & operator << (std::ostream &, const vector< T > &);
 
    template< class T >
    class vector {
        T * arr;
        size_t _size;
    public:
        explicit vector(size_t size = 0);
        vector(const vector &);
        virtual ~vector();
 
        void push_back(const T & value);
        size_t size() const;
 
        T & operator [] (size_t i);
                  const T & operator [] (size_t i) const;
        friend std::ostream & operator << < > (std::ostream &, const vector< T > &);
    }; 
} 
 
template< typename T >
my::vector< T >::vector(size_t size) : _size(size), arr(nullptr)
{
    if(_size)
    {
        arr = new T [_size];
        memset(this->arr, 0, _size * sizeof(T));
    }
}
 
template< typename T >
my::vector< T >::vector(const vector & other)
{
    this->_size = other._size;
    this->arr = new T [_size];
    memcpy(this->arr, other.arr, _size * sizeof(T));
}
 
template< typename T >
my::vector< T >::~vector()
{
    if(_size)
        delete [] this->arr;
}
 
template< typename T >
void my::vector< T >::push_back(const T & value)
{
    if(!_size)
    {
        this->arr = new T [++_size];
        arr[0] = value;
    }
    else
    {
        T * tmp_arr = new T [++_size];
        memcpy(tmp_arr, this->arr, (_size - 1) * sizeof(T));
        tmp_arr[_size - 1] = value;
        delete [] this->arr;
        this->arr = tmp_arr;
    }
}
 
template< typename T >
size_t my::vector< T >::size() const
{
    return this->_size;
}
 
template< typename T >
T & my::vector< T >::operator [] (size_t i)
{
    return this->arr[i];
}
 
template< typename T >
const T & my::vector< T >::operator [] (size_t i) const
{
    return this->arr[i];
}
 
template< typename T >
std::ostream & my::operator << (std::ostream & out, const vector< T > & vec)
{
    for(size_t i = 0; i < vec._size; i++)
        out << vec.arr[i] << "  ";
    return out;
}
 
int main()
{       
    my::vector<int> vec;
    std::cout << vec << std::endl << "size = " << vec.size() << std::endl;
    vec.push_back(1);
    std::cout << vec << std::endl << "size = " << vec.size() << std::endl;
    vec.push_back(111);
    std::cout << vec << std::endl << "size = " << vec.size() << std::endl;
    my::vector<int> vec2(10);
    std::cout << vec2 << std::endl << " vec2 size = " << vec2.size() << std::endl;
    std::getchar();
    return 0;
}
Добавлено через 19 секунд
оператор присваивания сами определите

Добавлено через 10 минут
упс..
в конструкторе копии ошибочку исправил
1
TheSoul
1 / 1 / 0
Регистрация: 29.12.2010
Сообщений: 17
13.06.2011, 23:10  [ТС] #5
Maxwe11, опишите пожалуйста, хотя бы вкратце, словестно принцип работы...
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2011, 23:12 #6
TheSoul, уж потрудитесь сами разобраться
0
TheSoul
1 / 1 / 0
Регистрация: 29.12.2010
Сообщений: 17
20.06.2011, 22:17  [ТС] #7
Maxwe11, в Code Gear не работает
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.06.2011, 22:30 #8
Цитата Сообщение от TheSoul Посмотреть сообщение
в Code Gear не работает
1. ошибки в студию
2. смените IDE
0
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
20.06.2011, 22:36 #9
Цитата Сообщение от Maxwe11 Посмотреть сообщение
template< typename T >
void my::vector< T >:ush_back(const T & value)
{
if(!_size)
{
this->arr = new T [++_size];
arr[0] = value;
}
else
{
T * tmp_arr = new T [++_size];
memcpy(tmp_arr, this->arr, (_size - 1) * sizeof(T));
tmp_arr[_size - 1] = value;
delete [] this->arr;
this->arr = tmp_arr;
}
}
Maxwe11, этот кусок кода очень плохо написан по-логике, хотелось бы узнать какова скорость работы будет вашего динмического массива, если перед каждой вставки вы делаете реаллокацию, выделели блок памяти из кучи скопировали в него другой удалили и присвоили уже новый, хм такой кусок кода не куда не годиться. Для этого вы должны завести переменную которое будет содеражть число выделения блоком например в начале 32 - элемента, далее при привышении только тогда делать нужно реаллокацию, на счёт свободной памяти не нужно беспокоиться, так пишуться все динамические массивы от HP, SGI, Microsoft, Borland, динамический массив чем хорош тем что скорость доступа для чтения и записи происходит по-индексу то есть мгновенно, но скорость вставки переразмещение памяти очень медлено, связные списки всё наоборот скорость вставки быстро, доступ для чтение или записи линейный зависит от длины связного списка узла, память используется рационально вот почему все файловые системы пишуться на связных списках - деревьях.
1
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
21.06.2011, 10:42 #10
Списки, стеки, очереди
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.06.2011, 11:33 #11
Maxwe11, Плохо с namespace обошелся. Реализация функций должна быть в том же namespace.
1
21.06.2011, 11:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2011, 11:33
Привет! Вот еще темы с ответами:

Реализация класса - C++
Так как только начал изучать с++, возникает вопрос: есть задание : Реализовать класс IntArray. Разработать тестовую программу для...

реализация класса - C++
Дано: класс &quot;Фильмы&quot; (название, жанр, главные роли). Вопрос: Возможно ли такой подход к реализации? class films { string...

Реализация класса - C++
Помогите понять пожалуйста. Пример из Дейтела: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;GradeBook.h&quot; using namespace...

Реализация класса Library - C++
Задание: 1) Реализуйте класс Book, который является частью программного обеспечения библиотеки. Класс Book должен иметь члены для...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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