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

Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом) - C++

Восстановить пароль Регистрация
 
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
24.09.2013, 17:23     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом) #1
Надо реализовать адаптер контейнера: приоритетная очередь на осонове списка. Должно оно быть описано в сообстенном параметризированом классе, со своими методами. Сделал шаблон класса, пытаюсь сделать метод добавления елемента в очередь(в моем методе попросу должнен использоваться стандартый метод push()). Но именно в том месте где прописан етот метод у меня ошибка. Ссылаеться на файл algorithm. В чем дело не могу понять. Почти такая же реализация для обычного контейнера не вызвала ошибок, а вот с адаптерами проблема. Помогите разобраться.

''main.cpp''
Кликните здесь для просмотра всего текста
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
//#include "sourse_1.h"
//#include "sourse_2.h"
//#include "sourse_3.h"
//#include "sourse_4.h"
#include "sourse_5.h"
 
 
void main()
{
    int key;
    while(true)
    {
        cout << "\t1)List - Double;\n\t2)List - Pair(string, double);\n\t3)Parametric list;\n\t4)Container adapter - priority queue;\n\t5)Parametric list adapter container - priority queue;\n\nEnter key: ";
        cin >> key;
        system("cls");
        switch(key)
        {
        /*case 1:
            {
                TASK_1();                   
            }; break;
        case 2:
            {
                TASK_2();
            }; break;
        case 3:
            {
                TASK_3();
            }; break;
        case 4: 
            {
                TASK_4();
            } break;*/
        case 5: 
            {
                TASK_5(); // вызов функции, в которой есть ошибки
            } break;
        }
    }
}


"sourse_5.h"
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <list>
#include <queue>
 
using namespace std;
 
void TASK_5();
 
template <class atype>
class myPriotQueue // шаблон класса, который я делаю
{
    private:
    priority_queue <atype, list<atype>, less<atype> > Queue;   // поле - приоритетная очередь сделанная из списка. 
    public:
        void push_q();
        void pop_q();
        void show_q();
        void ser_arif_q();
        void del_from_diap_q();
        void add_min_max_q();
};
"sourse_5.cpp''
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
#include "sourse_5.h"
 
 
void TASK_5() // функция, которую вызываю из main 
{
    myPriotQueue<double> mque;  // создаю обьект, полем которого есть очередь из СТЛ
    bool Q = true;
    while(Q == true)
    {
        int key;
        std::cout << "\n\t\t\tMENU\n\t1)PUSH ITEM TO THE QUEUE;\n\t2)POP ITEM FROM THE QUEUE;\n\t3)SHOW ITEMS IN QUEUE;\n\t4)DETERMINE THE AVERAGE ARITHMETIC AND PUSH IT IN THE QUEUE;\n\t5)DELETE ITEM FROM RANGE;\n\t6)ADD SUM MIN AND MAX ITEMS TO ALL ITEMS OF QUEUE;\n\t0)Exit.\n\tEnter key:";
        std::cin >> key;
        switch(key)
        {
            case 1: mque.push_q(); break; // вызов моего метода для обьекта
            //case 2: mque.pop_q(); break;
            //case 3: mque.show_q(); break;
            //case 4: mque.ser_arif_q();break;
            //case 5: mque.del_from_diap_q();break;
            //case 6: mque.add_min_max_q();break;
            case 0: {Q = false;}
        }
        system("cls");
    }
    system("cls");
}
 
template<class atype> 
void myPriotQueue<atype>::push_q()    // мой метод добавления елемента в очередь
{
    cout << "\nFUNCTION PUSH FOR A QUEUE";
    atype val;
    while(true)
    {
        cout << "\nEnter value: ";
        cin >> val;
        Queue.push(val); //<------ тут ошибка, которая ссылаеться на строки в файле algorithm
        char Q = 'y';
        while(true)
        {
            cout << "\nContinue(y/n)?";
            cin >> Q;
            if (Q == 'y')
                break;
            if (Q == 'n')
                break;
            else
            {
                cout << "\nError! Invalid choise. Try again";
                continue;
            }
        }
        if (Q == 'n') 
            break;
    }
    system("pause");
}
//
//template<class atype> 
//void myPriotQueue<double>::pop_q()
//{
//  cout << "\nFUNCTION POP FOR A QUEUE\n";
//  if (mylist.size()==0)
//      cout << "\nError! List is empty.\n";
//  else
//  {
//      mque.pop();
//      cout << "\nItem deleted\n";
//  }
//  system("pause");
//}
//
//template<class atype> 
//void myPriotQueue<double>::show_q()
//{
//  cout << "\nSHOW LIST\n";
//  if (mylist.size()==0)
//      cout << "\nError! List is empty.\n";
//  else
//  {
//      priority_queue <double>::iterator I;
//      for(I = mylist.begin(); I != mylist.end(); I++)
//      {
//          cout << *I << "\t";
//      }
//      cout<<"\n";
//  }
//  system("pause");
//}
//
//template<class atype> 
//void myPriotQueue<double>::ser_arif_q()
//{
//  cout << "\nDETERMINE THE AVERAGE ARITHMETIC AND PUSH IT IN THE BOTTOM OF THE LIST\n";
//  if (mylist.size()==0)
//      cout << "\nError! List is empty.\n";
//  else
//  {
//      double sum=0, ser_arif;
//      list<atype>::iterator S;
//      for(S = mylist.begin(); S != mylist.end(); S++)
//      {
//          sum = sum + *S;
//      }
//      ser_arif = sum / mylist.size();
//      cout << "\nAVERAGE ARITHMETIC = " << ser_arif <<  endl;
//      mylist.push_back(ser_arif);
//  }
//  system("pause");
//}
//
//template<class atype> 
//void myPriotQueuey_prior_queue<double>::del_from_diap_q()
//{
//  cout << "\nREMOVE ITEMS FROM THE SPECIFIED RANGE\n";
//  if (mylist.size()==0)
//      cout << "\nError! List is empty.\n";
//  else
//  {
//      list<atype> mylist_tmp = mylist;
//      double a,b;
//      cout << "\nEnter diapason: \n";
//      cin >> a >> b;
//      if (a > b)
//          swap(a,b);
//
//      int size = mylist.size();
//
//      for (int i = 0; i < size; i++)
//      {
//          mylist.pop_front();
//      }
//  
//      for (int i = 0; i < size; i++)
//      {
//          if (mylist_tmp.front() >= a && mylist_tmp.front() <= b)
//              mylist_tmp.pop_front();
//          else 
//          {
//              double TMP = mylist_tmp.front();
//              mylist.push_back(TMP);
//              mylist_tmp.pop_front();
//          }
//      }
//  }
//  system("pause");
//}
//
//template<class atype> 
//void myPriotQueue<double>::add_min_max_q()
//{
//  cout << "\nADD MIN MAX\n";
//  list<atype>::iterator Q;
//  double min = mylist.front(), max=mylist.front(), sum;
//  int size = mylist/*_tmp*/.size();
//  
//  for (Q = mylist.begin(); Q != mylist.end(); Q++)
//  {
//      if (*Q > max)
//          max = *Q;
//      if (*Q < min)
//          min = *Q;
//  }
//  sum = max+min;
//  cout << "\nMin: " << min << "\nMax: " << max << "\nSum: " << sum << endl;
//  for (Q = mylist.begin(); Q != mylist.end(); Q++)
//  {
//      *Q = *Q + sum;
//  }
//  system("pause");
//}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 17:23     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом)
Посмотрите здесь:

Очередь с приоритетом. C++
Очередь с приоритетом C++
C++ очередь с приоритетом
Очередь с приоритетом C++
Очередь с приоритетом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 292
24.09.2013, 17:44     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом) #2
Так писать не принято:
C++
1
while(Q == true)
Если тип bool то лучше записывать так:
C++
1
while(Q)
А на счет проблемы можно воспользоваться конструктором с одним параметром, тогда никаких ошибок не выдает:
C++
1
priority_queue <atype> Queue;
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
24.09.2013, 18:05  [ТС]     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом) #3
Insane__, спасибо, теперь етот метод заработал. но теперь проблема в методе show_q();
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<class atype> 
void myPriotQueue<atype>::show_q()
{
    cout << "\nSHOW LIST\n";
    if (Queue.size()==0)
        cout << "\nError! List is empty.\n";
    else
    {
        myPriotQueue<atype> quetmp = Queue;  // немогу создать копию 
        for (int i = 0; i < quetmp.size(); i++)
        {
            cout << '\n' << quetmp.top();
            quetmp.pop_q();
        }
        cout<<"\n";
    }
    system("pause");
}
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 292
24.09.2013, 18:20     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом) #4
myPriotQueue<atype> quetmp; - это тип который вы создали
Queue - это тип priority_queue
Чувствуете разницу?

Добавлено через 7 минут
Сделайте соответствующий конструктор, например:
C++
1
2
3
myPriotQueue(priority_queue <atype> Q){
        Queue = Q;
    }
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
24.09.2013, 19:09  [ТС]     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом) #5
Insane__, переделал. но вот такой вопрос. очередь с приоритетом ето ведь адаптер. когда я создавал просто очередь, то писал так:
C++
1
    priority_queue <double, vector<double>, less<double> > myqueue;
, тоисть задавал киким образом заносить данные в очередь. а вот в етом задании, что я тут спрашивал вы посоветовали сделать так:
C++
1
priority_queue <atype> Queue;  // поле моего класса
вот и я не могу понять, куда писать less<> или greater<>
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 292
24.09.2013, 19:28     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом) #6
Цитата Сообщение от o33ik Посмотреть сообщение
priority_queue <double, vector<double>, less<double> > myqueue;
Здесь vector<double> и less<double> можно не писать, так как они являются параметрами по умолчанию.

В вашем классе думаю будет так:
C++
1
priority_queue <atype,vector<atype>, less<atype>/*greater<atype>*/> Queue;
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
24.09.2013, 20:03  [ТС]     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом) #7
Insane__, ага, теперь все понятно, спасибо

Добавлено через 30 минут
Insane__, ех.. мне по заданию надо контейнер делать не от вектора делать, а от списка. опять не могу создать копию в show_q(). но конструктор то есть, и если вместо адаптера для списка использовать вектор, то работает.
Кликните здесь для просмотра всего текста

"sourse_5.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
#include <iostream>
#include <string>
#include <list>
#include <queue>
 
using namespace std;
 
void TASK_5();
 
template <class atype>
class myPriotQueue
{
    private:
    priority_queue <atype,list<atype>, less<atype> > Queue;
 
    public:
        myPriotQueue(){}
        myPriotQueue(priority_queue <atype> Q)
        {
            Queue = Q;
        }
        void push_q();
        void pop_q();
        void show_q();
        void ser_arif_q();
        void del_from_diap_q();
        void add_min_max_q();
};
"sourse_5.cpp"
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
#include "sourse_5.h"
 
 
void TASK_5()
{
    myPriotQueue<double> mque;
    bool Q = true;
    while(Q)
    {
        int key;
        std::cout << "\n\t\t\tMENU\n\t1)PUSH ITEM TO THE QUEUE;\n\t2)POP ITEM FROM THE QUEUE;\n\t3)SHOW ITEMS IN QUEUE;\n\t4)DETERMINE THE AVERAGE ARITHMETIC AND PUSH IT IN THE QUEUE;\n\t5)DELETE ITEM FROM RANGE;\n\t6)ADD SUM MIN AND MAX ITEMS TO ALL ITEMS OF QUEUE;\n\t0)Exit.\n\tEnter key:";
        std::cin >> key;
        switch(key)
        {
            case 1: mque.push_q(); break;
            case 2: mque.pop_q(); break;
            case 3: mque.show_q(); break;
            //case 4: mque.ser_arif_q();break;
            //case 5: mque.del_from_diap_q();break;
            //case 6: mque.add_min_max_q();break;
            case 0: {Q = false;}
        }
        system("cls");
    }
    system("cls");
}
 
template<class atype> 
void myPriotQueue<atype>::push_q()
{
    cout << "\nFUNCTION PUSH FOR A QUEUE";
    atype val;
    while(true)
    {
        cout << "\nEnter value: ";
        cin >> val;
        Queue.push(val);
        char Q;
        while(true)
        {
            cout << "\nContinue(y/n)?";
            cin >> Q;
            if (Q == 'y')
                break;
            if (Q == 'n')
                break;
            else
            {
                cout << "\nError! Invalid choise. Try again";
                continue;
            }
        }
        if (Q == 'n') 
            break;
    }
}
 
template<class atype> 
void myPriotQueue<atype>::pop_q()
{
    cout << "\nFUNCTION POP FOR A QUEUE\n";
    if (Queue.size()==0)
        cout << "\nError! List is empty.\n";
    else
    {
        Queue.pop();
        cout << "\nItem deleted\n";
    }
    system("pause");
}
 
template<class atype> 
void myPriotQueue<atype>::show_q()
{
    cout << "\nSHOW LIST\n";
    if (Queue.size()==0)
        cout << "\nError! List is empty.\n";
    else
    {
        priority_queue <atype> quetmp = Queue;  // немогу создать копию 
        while (quetmp.size()!=0)
        {
            cout << quetmp.top() << "\n";
            quetmp.pop();
        }
        cout<<"\n";
    }
    system("pause");
}
//
//template<class atype> 
//void myPriotQueue<double>::ser_arif_q()
//{
//  cout << "\nDETERMINE THE AVERAGE ARITHMETIC AND PUSH IT IN THE BOTTOM OF THE LIST\n";
//  if (mylist.size()==0)
//      cout << "\nError! List is empty.\n";
//  else
//  {
//      double sum=0, ser_arif;
//      list<atype>::iterator S;
//      for(S = mylist.begin(); S != mylist.end(); S++)
//      {
//          sum = sum + *S;
//      }
//      ser_arif = sum / mylist.size();
//      cout << "\nAVERAGE ARITHMETIC = " << ser_arif <<  endl;
//      mylist.push_back(ser_arif);
//  }
//  system("pause");
//}
//
//template<class atype> 
//void myPriotQueuey_prior_queue<double>::del_from_diap_q()
//{
//  cout << "\nREMOVE ITEMS FROM THE SPECIFIED RANGE\n";
//  if (mylist.size()==0)
//      cout << "\nError! List is empty.\n";
//  else
//  {
//      list<atype> mylist_tmp = mylist;
//      double a,b;
//      cout << "\nEnter diapason: \n";
//      cin >> a >> b;
//      if (a > b)
//          swap(a,b);
//
//      int size = mylist.size();
//
//      for (int i = 0; i < size; i++)
//      {
//          mylist.pop_front();
//      }
//  
//      for (int i = 0; i < size; i++)
//      {
//          if (mylist_tmp.front() >= a && mylist_tmp.front() <= b)
//              mylist_tmp.pop_front();
//          else 
//          {
//              double TMP = mylist_tmp.front();
//              mylist.push_back(TMP);
//              mylist_tmp.pop_front();
//          }
//      }
//  }
//  system("pause");
//}
//
//template<class atype> 
//void myPriotQueue<double>::add_min_max_q()
//{
//  cout << "\nADD MIN MAX\n";
//  list<atype>::iterator Q;
//  double min = mylist.front(), max=mylist.front(), sum;
//  int size = mylist/*_tmp*/.size();
//  
//  for (Q = mylist.begin(); Q != mylist.end(); Q++)
//  {
//      if (*Q > max)
//          max = *Q;
//      if (*Q < min)
//          min = *Q;
//  }
//  sum = max+min;
//  cout << "\nMin: " << min << "\nMax: " << max << "\nSum: " << sum << endl;
//  for (Q = mylist.begin(); Q != mylist.end(); Q++)
//  {
//      *Q = *Q + sum;
//  }
//  system("pause");
//}
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 292
24.09.2013, 20:19     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом) #8
Если и создавать копию то с таким же контейнером адаптером как и оригинал.
C++
1
priority_queue <atype,list<atype>, less<atype> > quetmp = Queue;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2013, 20:28     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом)
Еще ссылки по теме:

Параметризованный класс и СТЛ(список) C++
C++ Очередь с приоритетом. Элементы с наивысшим приоритетом ставятся в начало очереди, с наименьшим – в конец
C++ Создайте класс, в котором есть ostream& operator<<. Класс должен содержать очередь с приоритетом

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

Или воспользуйтесь поиском по форуму:
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
24.09.2013, 20:28  [ТС]     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом) #9
Insane__, теперь такие ошибки
Миниатюры
Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом)  
Yandex
Объявления
24.09.2013, 20:28     Параметризованный класс(поле - список адаптера контейнера - очередь с приоритетом)
Ответ Создать тему
Опции темы

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