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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
TheSoul
1 / 1 / 0
Регистрация: 29.12.2010
Сообщений: 17
13.06.2011, 00:10     Реализация класса контейнер. #1
Естественно, это нужно сделать без использования подключаемых библиотек.
Описать шаблон-класс нужно сначало. И затем программу, которая покажет все возможности этого щаблон-класса.

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

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;
 };
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2011, 00:10     Реализация класса контейнер.
Посмотрите здесь:

C++ Реализация класса
C++ реализация класса
C++ Реализация класса
Создание контейнер класса C++
Реализация класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.06.2011, 13:22     Реализация класса контейнер. #2
Это набор законченных предложений и кусок какого-то шаблона, выдернутый из контекста. С какой целью это все написано?
TheSoul
1 / 1 / 0
Регистрация: 29.12.2010
Сообщений: 17
13.06.2011, 21:44  [ТС]     Реализация класса контейнер. #3
Есть задание реализовать контейнер. Тоесть описать его как класс, не подключая библиотеки. Вот и получается что 2 задачи. Описать класс контейнер затем связать его с программой, которая будет показывать возможности этого класса. Как описать класс для одного типа объектов это ясно. А вот хотелось бы его сделать универсальным. Там должен быть принципиально другой подход. Вот хотелось бы узнать, как это возможно сделать..
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 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 минут
упс..
в конструкторе копии ошибочку исправил
TheSoul
1 / 1 / 0
Регистрация: 29.12.2010
Сообщений: 17
13.06.2011, 23:10  [ТС]     Реализация класса контейнер. #5
Maxwe11, опишите пожалуйста, хотя бы вкратце, словестно принцип работы...
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2011, 23:12     Реализация класса контейнер. #6
TheSoul, уж потрудитесь сами разобраться
TheSoul
1 / 1 / 0
Регистрация: 29.12.2010
Сообщений: 17
20.06.2011, 22:17  [ТС]     Реализация класса контейнер. #7
Maxwe11, в Code Gear не работает
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.06.2011, 22:30     Реализация класса контейнер. #8
Цитата Сообщение от TheSoul Посмотреть сообщение
в Code Gear не работает
1. ошибки в студию
2. смените IDE
xAtom
 Аватар для xAtom
910 / 735 / 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, динамический массив чем хорош тем что скорость доступа для чтения и записи происходит по-индексу то есть мгновенно, но скорость вставки переразмещение памяти очень медлено, связные списки всё наоборот скорость вставки быстро, доступ для чтение или записи линейный зависит от длины связного списка узла, память используется рационально вот почему все файловые системы пишуться на связных списках - деревьях.
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
21.06.2011, 10:42     Реализация класса контейнер. #10
Списки, стеки, очереди
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2011, 11:33     Реализация класса контейнер.
Еще ссылки по теме:

Создать контейнер класса с методами включения и удаления строки, очистки текста, подсчета количества символов C++
Контейнер Map. Использование класса как ключ C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.06.2011, 11:33     Реализация класса контейнер. #11
Maxwe11, Плохо с namespace обошелся. Реализация функций должна быть в том же namespace.
Yandex
Объявления
21.06.2011, 11:33     Реализация класса контейнер.
Ответ Создать тему
Опции темы

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