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

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

Войти
Регистрация
Восстановить пароль
 
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
#1

Что такое контейнерная библиотека объектов? - C++

15.04.2013, 22:04. Просмотров 898. Ответов 13
Метки нет (Все метки)

Доброго времени суток. Возник такой вопрос. По заданию надо выполнять каждую лабораторную в трех вариантах:
"Работы должны быть выполнены в трёх вариантах:
1. с использованием основных положений ООП в соответствии с заданием,
2. с использованием контейнерной библиотеки объектов,
3. с использованием контейнерной библиотеки шаблонов."
Первый вариант, как и третий (это же про STL?) мне ясен. В первом варианте я работы выполнил, в третьем не проблема.
А теперь вопрос. Что такое контейнерная библиотек объектов?
Было бы неплохо, если бы Вы реализовали задание этим вариантом (для наглядности). Например такое:
"Создать класс, отражающий структуру данных согласно выбранному варианту задания. Класс должен содержать методы для чтения, установки и отображения своих данных. Реализовать класс List для управления динамическим списков из элементов созданного класса."
Работа выполненная по первому варианту представлена ниже. Третьим вариантом это с помощью #include <list.h> (в нашем случае). Я правильно понимаю?
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
# include <iostream>
 
using namespace std;
 
struct Date{
    unsigned int day;
    unsigned int month;
    unsigned int year;
};
 
class List{ 
   public:
    Date* date;
    List* next;
    List():next(0) {};
};
 
class inout{
    List* begin;
    List* current; 
    int i;
public:
    inout():begin(0),current(0) {};
    
    ~inout(){   
        while (begin!=0){
            current=begin;
            begin=current->next;
            delete current;
         }
     };
 
    void add() {
        int i=1;
        while (i!=0){
            if (begin==0){
                begin = new List(); 
                begin->date=new Date();
                current=begin;
            }
            else{
                current->next=new List();
                current=current->next; 
                current->date=new Date;
            };
            cout<< "Enter date: "<< endl;
            cin>>current->date->day>>current->date->month>>current->date->year; 
            cout<<"Enter 0 to exit: "<<endl;
            cin>>i;
        };
    };
 
    void out() {
        current=begin;
        while(current!=0){
        cout<<current->date->day<<"."<<current->date->month<<"."<<current->date->year << endl;
        current=current->next;
        };
    };
};
 
int main() {
    inout o;
    o.add();
    o.out();
    return 0;
Добавлено через 1 час 38 минут
Кто знает, что это?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2013, 22:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что такое контейнерная библиотека объектов? (C++):

Что такое библиотека (lib)? - C++
всем доброго времени суток. задали написать прогу для работы с БД. одним из пунктов требований к ней - &quot;создание и использование файла...

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? - C++
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа? - C++
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что такое хэндлер файла? Что такое файловый указатель? - C++
Что такое хэндлер файла? Что такое файловый указатель?

Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них - C++
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них пожалуйста.

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере - C++
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их несколько). Можно ли, как-то, использовать...

13
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
15.04.2013, 22:57 #2
Может быть имеются ввиду контейнеры STL
0
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
16.04.2013, 00:40  [ТС] #3
Вроде stl это по третьему варианту.

Добавлено через 1 час 32 минуты
Может догадки есть? Или хотя бы чем третий и второй отличаются?
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 760
16.04.2013, 02:37 #4
мне кажется ваша задача стояла так:
1) замутить самому класс List
2) воспользоваться STL-ным <list>
3) замутить из своего класса List (1-го задания) шаблонный класс типа template <class T> class List {...};

но могу ошибаться, слишком мутно написано
1
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
16.04.2013, 09:20 #5
Цитата Сообщение от art3330 Посмотреть сообщение
контейнерной библиотеки объектов
Такое, прямо скажем, сочетание слов не является общеупотребительным. Лучше уточнить у преподавателя, что он имеет в виду. Посмотрите конспект, если вы на него не забили. Наверняка там есть определения.

Если считать, что вашей задачей является создание класса для хранения дат в виде связного списка, то последние две ипостаси как раз понятны.
2 -- создать класс List с жестко заданным типом хранимых объектов.
3 -- создать класс List с типом хранимых объектов, заданным шаблонным параметром.

А вот с первым пунктом проблемы, потому что обе реализации будут подходить под первое описание.
1
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
16.04.2013, 10:41  [ТС] #6
Сделаю я тогда с помощью stl. А там надо будет разузнать.

Добавлено через 1 минуту
Спасибо за помощь =)
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
16.04.2013, 11:09 #7
Ну какой STL, когда в задании ясно написано:
Цитата Сообщение от art3330 Посмотреть сообщение
Создать класс, отражающий структуру данных
Цитата Сообщение от art3330 Посмотреть сообщение
Реализовать класс List для управления динамическим списков
Смысл задания в том, чтобы создать два класса -- класс описывающий некую структуру данных (видимо у вас дата) и класс, управляющий динамическим списком, у вас, очевидно, двусвязный.

Кликните здесь для просмотра всего текста
Класс Date, наивная реализация. Шаблонный двусвязный список на итераторах. Не хватает некоторых функций -- собрано на коленке.
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include <iostream>
 
class Date {
 public:
  Date() : day(1), month(1), year(1971) {}
  Date(unsigned int day, unsigned int month, unsigned int year)
    : day(day), month(month), year(year) {}
  unsigned int getDay() const { return day; }
  unsigned int getMonth() const { return month; }
  unsigned int getYear() const { return year; }
  void setDay(unsigned int value) { day = value; }
  void setMonth(unsigned int value) { day = value; }
  void setYear(unsigned int value) { day = value; }
  static const std::string MONTH_NAMES[12];
 private:
  unsigned int day, month, year;
};
 
const std::string Date::MONTH_NAMES[12] = {"JAN", "FEB", "MAR", "APR",
  "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
 
std::ostream &operator<<(std::ostream &stream, const Date date) {
  return stream << ((date.getDay() < 10) ? "0" : "") << date.getDay() <<
    "." << ((date.getMonth() < 10) ? "0" : "") << date.getMonth() <<
    "." << date.getYear();
}
 
struct ListNodeBase {
  ListNodeBase *prev, *next;
  ListNodeBase() : prev(this), next(this) {}
  ListNodeBase(ListNodeBase *prev, ListNodeBase *next) : prev(prev), next(next) {
    next->prev = prev->next = this;
  }
  virtual ~ListNodeBase() {
    next->prev = prev;
    prev->next = next;
  }
};
 
template <class T>
struct ListNode : public ListNodeBase {
  T value;
  ListNode(ListNodeBase *prev, ListNodeBase *next, const T &value)
    : ListNodeBase(prev, next), value(value) {}
};
 
struct ListIteratorBase {
  ListIteratorBase() : node(0) {}
  ListIteratorBase(ListNodeBase *node) : node(node) {}
  
  void increment() { node = node->next; }
  void decrement() { node = node->prev; }
  
  bool operator==(const ListIteratorBase &other) const {
    return node == other.node;
  }
  bool operator!=(const ListIteratorBase &other) const {
    return node != other.node;
  }
  ListNodeBase *node;
};
 
template <class ValueType, class PointerType, class ReferenceType>
struct ListIterator : public ListIteratorBase {
  typedef ValueType           Value;
  typedef PointerType         Pointer;
  typedef ReferenceType       Reference;
  typedef ListNode<ValueType> Node;
  typedef ListIterator<ValueType, PointerType, ReferenceType> Self;
  typedef ListIterator<ValueType, ValueType*, ValueType&> Iterator;
  typedef ListIterator<ValueType, const ValueType*,
    const ValueType&> ConstIterator;
  
  ListIterator() : ListIteratorBase() {}
  ListIterator(const Iterator &other) : ListIteratorBase(other.node) {}
  ListIterator(ListNodeBase *node) : ListIteratorBase(node) {}
  
  Reference operator*() const { return ((Node*)node)->value; }
  Pointer operator->() const { return &(operator*()); }
 
  Self &operator++() {
    increment();
    return *this;
  }
  Self &operator--() {
    decrement();
    return *this;
  }
  Self &operator++(int) {
    Self result = *this;
    increment();
    return result;
  }
  Self &operator--(int) {
    Self result = *this;
    decrement();
    return result;
  }
  
};
 
template <class T>
class List {
 public:
  typedef T Value;
  typedef T* Pointer;
  typedef T& Reference;
  typedef ListIterator<T, T*, T&> Iterator;
  typedef ListIterator<T, const T*, const T&> ConstIterator;
  
  List() : size(0), base() {}
  List(const List &other) : size(0), base() {
    insert(other.begin(), other.end());
  }
  List &operator=(const List &other) {
    if (this != &other) {
      clear();
      insert(other.begin(), other.end());
    }
    return *this;
  }
  virtual ~List() {
    clear();
  }
  
  Iterator begin() { return (Node*)(base.next); }
  ConstIterator begin() const { return (Node*)(base.next); }
  Iterator end() { return (Node*)(&base); }
  ConstIterator end() const { return (Node*)(&base); }
  
  Iterator insert(Iterator position, const T &value) {
    ++size;
    return new Node(position.node->prev, position.node, value);
  }
  void insert(Iterator position, Iterator first, Iterator last) {
    while (first != last) {
      position = insert(position, *first++);
      ++position;
    }
  }
  Iterator erase(Iterator position) {
    Iterator next = position.node->next;
    delete position.node;
    -- size;
    return next;
  }
  Iterator erase(Iterator first, Iterator last) {
    while (first != last) {
      first = erase(first);
    }
    return first;
  }
  Iterator pushBack(const T &value) {
    return insert(end(), value);
  }
  Iterator pushFront(const T &value) {
    return insert(begin(), value);
  }
  bool isEmpty() const { return base.next == &base; }
  void clear() {
    while (!isEmpty()) {
      delete base.next;
    }
    size = 0;
  }
 private:
  typedef ListNode<T> Node;
  size_t size;
  ListNodeBase base;
};
 
int main(int argc, char *argv[]) {
  List<Date> list;
 
  list.pushBack(Date(10, 12, 2014));
  list.pushBack(Date(4, 7, 2013));
  list.pushBack(Date(1, 7, 2012));
 
  for (List<Date>::ConstIterator i = list.begin(); i != list.end(); ++i) {
    std::cout << *i << std::endl;
  }
  
  std::cin.get();
  return 0;
}
1
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
16.04.2013, 16:10  [ТС] #8
Спасибо. Попробую разобраться в этом коде =)

Добавлено через 51 минуту
lemegeton, так мне надо выполнить задание тремя способами

Добавлено через 2 часа 41 минуту
То что я в первом посте написал - правильная реализация первым способом

Добавлено через 39 минут
Есть у кого еще догадки?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.04.2013, 16:47 #9
art3330, Давайте вы все-таки узнаете у преподавателя, а не будем устраивать здесь игру "Угадайка"
0
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
16.04.2013, 18:29  [ТС] #10
С преподавателем пересекусь только через неделю, а за это время хотелось бы все сделать.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
17.04.2013, 07:58 #11
Цитата Сообщение от art3330 Посмотреть сообщение
То что я в первом посте написал - правильная реализация первым способом
Это прекрасно. Теперь сделайте две реализации класса-контейнера.
Цитата Сообщение от art3330 Посмотреть сообщение
2. с использованием контейнерной библиотеки объектов
Один с привязкой к типу хранимых данных.
Цитата Сообщение от art3330 Посмотреть сообщение
3. с использованием контейнерной библиотеки шаблонов.
Другой без привязки к типу хранимых данных, с шаблонным параметром. Пример есть в моем коде.


Кстати, ваш код класса Date не является классом с точки зрения теории, так как не инкапсулирует свойства.
1
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
17.04.2013, 11:37  [ТС] #12
Спасибо. Буду делать =)
0
UserAK
73 / 73 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
17.04.2013, 11:51 #13
тоже мне вот показалось, что задача на понимание отличий шаблонов от обычных классов с заданной структурой и размером.
1
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
17.04.2013, 12:08  [ТС] #14
Наверное так и есть =)
0
17.04.2013, 12:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2013, 12:08
Привет! Вот еще темы с ответами:

Что такое перегрузка оператора? Что у меня в коде за ошибка? - C++
Что же я написал?? Что оно не компилится? Что значит error C2275: Superclass: недопустимое использование этого типа в качестве выражения ...

В этой части кода происходит объявление функций? Что такое void? Что в скобках? - C++
В этой части кода происходит объявление функций? Что такое void? Что в скобках? void get(float **mas, int N, int M); void...

Что такое #, include, что это означает - C++
______

Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы - C++
Заранее спасибо.


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

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

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