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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
little_blond
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 13
#1

Частичная специализация. Контейнеры - C++

16.12.2012, 00:06. Просмотров 1373. Ответов 15
Метки нет (Все метки)

Всем привет, пытаюсь разобраться с шаблонами:
Требуется создать функцию печати для stack, queue, priority_queue.

Все было бы супер, но не вижу общей для всех трех контейнеров функции доступа к элементам. Для стека и приоритетной очереди это top(), для очереди front() и back(). Получается, для очереди нужна специализация. Но возникает вопрос, каким образом задавать очередь при специализации, поскольку она сама является шаблоном, параметризованным типом контейнера и типом обрабатываемых элементов. Частичная специализация для функций, насколько мне известно, не работает(или я неправа?).

Подскажите, пожалуйста, способ реализации такого принта или ткните носом в тему, где освещалась подобная задача.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2012, 00:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Частичная специализация. Контейнеры (C++):

Частичная специализация шаблона - C++
Доброго всем времени суток! Помогите разобраться в следующей ситуации. Есть шаблон класса #include <iostream> using...

Частичная специализация шаблона функции - C++
Добрый день, помогите разобраться в чем проблема кода: template <int X, int Y> bool isSimple(){ return X%Y == 0 &&...

Для чего нужна частичная специализация шаблона класса? - C++
Доброго времени суток объясните пожалуйста зачем нужна частичная специализация шаблонов класса

Специализация функции - C++
Добра всем! НЕ могу понять в чем ошибка: ||=== Build: Debug in test (compiler: GNU GCC Compiler) ===| E:\Dropbox\CPP\day...

Специализация шаблона - C++
Пытаюсь специализировать шаблон для типа float, но не получается. В чем проблема? Компилятор: 1>TemplateArr.obj : error LNK2005:...

специализация шаблона - C++
начал разбираться с шаблонами. если есть структура, и одна функция именно с int должна работать по особенному, написать можно вот так. ...

15
JlightenDev_C++
62 / 62 / 7
Регистрация: 12.08.2012
Сообщений: 150
16.12.2012, 00:59 #2
=> iterator
0
little_blond
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 13
16.12.2012, 01:07  [ТС] #3
И на что этот итератор будет "смотреть"? Как выставить его на первый элемент контейнера? Да и не работают вроде со стеками итераторы.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.12.2012, 01:08 #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
#include <vector>
#include <list>
#include <deque>
#include <iostream>
 
template <typename T>
void print(const T&)
{
   std::cout << "common print" << std::endl;
}
 
template <typename T>
void print(const std::vector<T>&)
{
   std::cout << "vector<T> print" << std::endl;
}
 
void print(const std::vector<char>&)
{
   std::cout << "vector<char> print" << std::endl;
}
 
int main()
{
   print(std::list<int>());
   print(std::deque<int>());
   print(std::vector<int>());
   print(std::vector<void*>());
   print(std::vector<char>());
   return 0;
}
если это не то, что надо, то непонятно, что вам надо. нужно больше инфы
1
little_blond
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 13
16.12.2012, 01:17  [ТС] #5
Спасибо, но, как мне кажется, не совсем то.
Задание дословно "Напишите шаблон функции для вывода значений stack, queue, priority_queue".

То есть по видимому нужен механизм, позволяющий использовать единый синтаксис для печати каждой из перечисленных сущностей. Нечто вроде:
C++
1
2
3
4
5
6
7
8
...
    stack<int, vector<int>> sv;
    queue<int, list<int>> qd;
    priority_queue<int, vector<int>, less<int>> pql;
...
    Print(sv);
    Print(qd);
    Print(pql);
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.12.2012, 01:20 #6
а вот это разве не единый синтаксис?
C++
1
2
3
4
5
  print(std::list<int>());
  print(std::deque<int>());
  print(std::vector<int>());
  print(std::vector<void*>());
  print(std::vector<char>());
вызывается функция принт. ей передается объект контейнера.
можно переписать так:

C++
1
2
3
4
5
6
7
8
9
10
11
std::list<int> c1;
std::deque<int> c2;
std::vector<int> c3;
std::vector<void*> c4;
std::vector<char> c5;
 
  print(с1);
  print(с2);
  print(с3);
  print(с4);
  print(с5);
0
JlightenDev_C++
62 / 62 / 7
Регистрация: 12.08.2012
Сообщений: 150
16.12.2012, 01:22 #7
Цитата Сообщение от little_blond Посмотреть сообщение
И на что этот итератор будет "смотреть"? Как выставить его на первый элемент контейнера? Да и не работают вроде со стеками итераторы.
.begin() & .end()
0
little_blond
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 13
16.12.2012, 01:30  [ТС] #8
DU,
да, все верно, спасибо! Не увидела сначала перегруженную функцию
C++
1
2
3
4
5
template <typename T>
void print(const std::vector<T>&)
{
   std::cout << "vector<T> print" << std::endl;
}
0
Avazart
Эксперт С++
7234 / 5430 / 303
Регистрация: 10.12.2010
Сообщений: 24,128
Записей в блоге: 17
16.12.2012, 01:53 #9
Цитата Сообщение от little_blond Посмотреть сообщение
Получается, для очереди нужна специализация.
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
//---------------------------------------------------------------------------
template <class C>
print(C c)
{
    while(!c.empty())
     {
         std::cout<<c.top()<<" ";
         c.pop();
     }
}
//---------------------------------------------------------------------------
template <class T>
print(std::queue<T> c)
{
    while(!c.empty())
     {
         std::cout<<c.front()<<" ";
         c.pop();
     }
}
//---------------------------------------------------------------------------
int main()
{
using namespace std;
 
stack<int> s;
 
s.push(1);
s.push(2);
s.push(3);
 
queue<int> q;
 
q.push(1);
q.push(2);
q.push(3);
 
priority_queue<int> pq;
 
pq.push(1);
pq.push(2);
pq.push(3);
 
 
print(s);  cout<<endl;
print(q);  cout<<endl;
print(pq); cout<<endl;
 
return 0;
}
3 2 1
1 2 3
3 2 1
1
little_blond
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 13
16.12.2012, 11:12  [ТС] #10
Avazart,
спасибо за ответ!

То есть в параметре очередь, являющаяся шаблоном от двух параметров, ( например, queue<int, list<int>>), может быть упомянута в функции как шаблон одного параметра? (queue<T>). Это было бы удобно.

Но у меня 2005 студия такой код не проглотила, ругается:
"error C2995: 'void Print(Ta &)' : function template has already been defined"

И действительно, разве такой синтаксис используется при специализации? Больше похоже на два разных шаблона с одинаковым списком параметров.

Мб дело в престарелом компиляторе? Помогите, пожалуйста, разобраться.
0
Avazart
Эксперт С++
7234 / 5430 / 303
Регистрация: 10.12.2010
Сообщений: 24,128
Записей в блоге: 17
16.12.2012, 13:12 #11
Ну я позабыл void понаписывать в возвращаемые значения
C++
1
2
3
4
5
6
7
//---------------------------------------------------------------------------
template <class C>
void print(C& c);
//---------------------------------------------------------------------------
template <class T>
void print(std::queue<T>& c);
//--------------------------------------------------------------------------
А вообще пример компилится на VC++2010 ( изначально писал на Builder2009)

Добавлено через 1 минуту
Цитата Сообщение от little_blond Посмотреть сообщение
И действительно, разве такой синтаксис используется при специализации? Больше похоже на два разных шаблона с одинаковым списком параметров.
Честно говоря не знаю можно ли это назвать специализацией, скорее всего перегрузка как и прошлом варианте.
1
little_blond
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 13
16.12.2012, 13:58  [ТС] #12
void я добляла, дело не в нем. Буду пробовать в VS 2010, спасибо
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.12.2012, 14:22 #13
Два раза JlightenDev_C++ сказал про итераторы. Нееет, мы будем писать костыли через top, front и прочую ерунду.
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
#include <iostream>
#include <vector>
#include <deque>
#include <set>
#include <utility>
 
template <class Container>
void print(const Container& c, std::ostream& stream = std::cout)
{
    for(const auto& elem: c)
        stream << elem << ' ';
}
 
int main()
{
    std::vector<int>    v{1, 2, 3};
    std::deque<int>     d{3, 2, 1};
    std::set<int>       s{2, 3, 1};
 
    print(v);
    std::cout << std::endl;
 
    print(d);
    std::cout << std::endl;
 
    print(s);
    std::cout << std::endl;
 
    return 0;
}
1
Avazart
Эксперт С++
7234 / 5430 / 303
Регистрация: 10.12.2010
Сообщений: 24,128
Записей в блоге: 17
16.12.2012, 14:25 #14
soon, Аля какие итераторы в стеке и очереди ? они закрыты ...
2
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.12.2012, 14:38 #15
Ладушки, мой косяк. Извините.
0
16.12.2012, 14:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2012, 14:38
Привет! Вот еще темы с ответами:

Специализация конструктора: - C++
template &lt;int N&gt; class static_str { char data; } class A { template &lt;typename T&gt; A(T t){};

Явная специализация - C++
Здрасти, Народ. Подскажите плз в чем преимущество явной специализации перед перед обычным применением перегруженной функции. Привожу...

явная специализация - C++
нужно реализовать специализацию по шаблону. Специализация должна принимать массив строк, и вернуть наибольшую строку. template...

Специализация шаблона - C++
Здравствуйте! Задача: Создайте шаблонную функцию maxn(), которая принимает в качестве аргумента массив элементов типа Т и целое...


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

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

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