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

STL очередь - C++

Восстановить пароль Регистрация
 
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
26.03.2013, 00:12     STL очередь #1
Доброго времени суток! Изучаю STL и решил сделать класс для работы с очередью, и получилось что-то вроде этого... сильно не кричите, только начал изучать

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
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <queue>
#include <algorithm>
#include <locale>
using namespace std;
 
template <typename T>
class QueueNode
{
    private:
        queue<T> coll;
 
    public:
        QueueNode()
        {
            ;
        }
 
        void addToBack(const T value);
        void delQueue();
        void showQueue();
};
 
template <typename T>
void QueueNode<T>::addToBack(const T value)     
{
    coll.push(value);
}
 
template <typename T>
void QueueNode<T>::delQueue()
{
    coll.pop();
}
 
template <typename T>
void QueueNode<T>::showQueue()
{
    if(!coll.empty())
    {
        for(unsigned i = 0; i < coll.size(); ++i)
        {
            cout << coll.front() << ' ';
            coll.push(coll.front());
            coll.pop();
        }
    }
    else
        wcout << L"Очередь пустa!\n";
}
 
void instructions();
void menu();
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));
    wcin.imbue(locale(".866"));
 
    menu();
 
    cout << "\n\n";
    return 0;
}
 
void instructions()
{
    wcout << L"Выберите пункт меню: " <<
        L"\n1 - Добавить элемент в начало" <<
        L"\n2 - Удалить элемент из начала" <<
        L"\n3 - Выход.\n";
}
 
void menu()
{
    QueueNode<int> Universal;
    int punkt_menu, value;
 
    instructions();
 
 
    do{
        wcout << L"\n? ";
            cin >> punkt_menu;
 
            switch(punkt_menu)
            {
                case 1:
                    wcout << L"Введите число: ";
                        cin >> value;
 
                    Universal.addToBack(value);
                    Universal.showQueue();
                    break;
                case 2:
                    Universal.delQueue();
                    Universal.showQueue();
                    break;
            }
 
    }while(punkt_menu != 3);
}
Так вот, меня интересует функция вывода, я сначала хотел реализовать ее через
C++
1
for_each
, но у меня не получилось, вот хотел узнать, может кто предложит вариант Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
26.03.2013, 04:38     STL очередь #2
for_each работает через итераторы. У контейнера queue итераторов нет. Для таких целей лучше использовать список list.
0x10
26.03.2013, 05:43
  #3

Не по теме:

Смысла работы не понял. Взяли std::queue, обернули в свой класс и все программирование свелось к пробрасыванию своих методов к методам std::queue.

yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
26.03.2013, 08:35  [ТС]     STL очередь #4
anmartex, а есть ли возможность использовать какой-либо алгоритм для вывода очереди?

Добавлено через 50 секунд
0x10, это скорее для практики, конечно можно было сделать просто несколько функций, но решил через класс сделать.
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
26.03.2013, 09:22     STL очередь #5
Цитата Сообщение от yoghurt92 Посмотреть сообщение
а есть ли возможность использовать какой-либо алгоритм для вывода очереди?
Для queue? Имея на борту только методы:
Код
empty
size
front
back
push
pop
сложно, что-то ещё придумать. Плюс сама идеология очереди не позволяет выполнять над ней какие-либо манипуляции позволяющие пробежаться по элементам, кроме как выдавливать элемент из начала очереди и вставлять его обратно в конец (т.е. тот самый механизм, который реализован у вас).

P.S.: Повторюсь: для таких целей используйте контейнер list

Добавлено через 27 минут
Вот, на просторах интернета нарыл обёртку адаптер:
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
#include <queue>
#include <iostream>
 
template <class Container>
class Adapter : public Container
{
   public:
      typedef typename Container::container_type container_type;
      container_type& get_container()
      {
         return this->c;
      }
};
 
int main()
{
   typedef std::queue<int> C;
   typedef Adapter<C> Container;
 
   Container adapter;
 
   for (int i = 0; i < 10; ++i)
   {
      adapter.push(i);
   }
 
   Container::container_type& c = adapter.get_container();
   for (Container::container_type::iterator it = c.begin(); it != c.end(); ++it)
   {
      std::cout << *it << " ";
   }
 
   return 0;
}
Идея заключается в том, чтобы получить доступ к защищённому полю c, который в свою очередь является контейнером deque или list. А здесь уже есть итераторы . Хотя на мой взгляд это ещё тот огород, и лучше отвёртку использовать для болтов, а молоток для гвоздей.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
26.03.2013, 14:41  [ТС]     STL очередь #6
anmartex, спасибо вам
Yandex
Объявления
26.03.2013, 14:41     STL очередь
Ответ Создать тему
Опции темы

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