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

Iseq - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.07.2013, 22:27     Iseq #1
Здорова! Есть задачка:
"Определите версию iseq() (параграф 18.3.1), для встроенных массивов istream и пар итераторов. Задайте подходящий набор перегруженных не модифицирующих последовательность алгоритмов (параграф 18.5) для работы с Iseq. Обсудите как избежать неоднозначностей и сильного роста числа функциональных шаблонов."

От примерчик что в книге есть, я его чуток модифицировал, пытался find_if сам перегрузить:
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
#include <iostream>
using std::cout;
using std::endl;
#include <list>
using std::list;
#include <algorithm>
using std::find;
#include <string>
using std::string;
#include <utility>
using std::pair;
#include <functional>
using std::equal_to;
using std::bind2nd;
 
template<class In> struct Iseq : public pair<In,In>
{
    Iseq(In i1, In i2) : pair<In,In>(i1,i2){}
};
 
template<class C> Iseq<typename C::iterator> iseq(C& c)//для всего контейнера
{
    return Iseq<typename C::iterator>(c.begin(),c.end());
}
 
template<class In,class T> In find(Iseq<In> r,const T& v)//расширение
{
    return find(r.first,r.second,v);
}
//перегрузка find_if
template<class In, class T> In find_if(Iseq<In> r,T(*ptr)(T))
{
    return find_if(r.first,r.second,ptr);
}
 
 
void f(list<string>& ls)
{
    list<string>::iterator p=find(ls.begin(),ls.end(),"standard");
    list<string>::iterator q=find(iseq(ls),"two");
    if(q!=ls.end())
        cout <<"*q= "<<*q<<endl;
    else
        cout <<"not find"<<endl;
    //...
}
 
//собственный предикат
bool pr(string a){return ("two"==a);}
 
int main()
{
    list<string> l;
    l.push_back("one");
    l.push_back("two");
    l.push_back("three");
    l.push_back("four");
 
    f(l);
 
    list<string>::iterator it;
    //iseq(l) l type list<string>
    it=find(iseq(l),"three");
    if(it!=l.end())
        cout <<"*it= "<<*it<<endl;//three
 
    //find_if
    it=find_if(iseq(l),pr);
 
    if(it!=l.end())
        cout <<"*it= "<<*it<<endl;//two
 
    return 0;
}
Тот пример что в книге рабочий, это я просто сам уже пытался функцию find_if перегрузить сам, но нифига не получается, никак не могу передать функцию в шаблон плюс еще не понятно что это за фигня встроенный массив istream??? и перегрузить для пар итераторов, ну для итераторов то вроде как чуток смутно понятно, типо должно функция iseq принимать по две пары итераторов, да нет и с итераторами не ясно. ?????

Добавлено через 10 минут
Ладно функцию я кое как передал вроде заработало, от утета от фигня не сильно понятна "для встроенных массивов istream и пар итераторов." Я понял конечно что нужно или класс перегрузить или саму функцию для итераторов, а скорее всего одновременно и класс и функцию.????

Добавлено через 3 минуты
А тут уже разобрался что имеется введу под парой итератовров, просто сделать что бы было удобно вызывать такие алгоритмы как transform или mismatch, просто их перегрузить. Отета от фигня остается не понятой "для встроенных массивов istream"

Добавлено через 20 часов 5 минут
up .
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newyork7776
 Аватар для newyork7776
346 / 339 / 79
Регистрация: 21.05.2013
Сообщений: 1,305
Завершенные тесты: 1
14.07.2013, 23:48     Iseq #2
Форум С++ для начинающих - наверное не тот раздел!?!?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
14.07.2013, 23:51  [ТС]     Iseq #3
Цитата Сообщение от newyork7776 Посмотреть сообщение
Форум С++ для начинающих - наверное не тот раздел!?!?
Ну тут и эксперты смотрят, так что норм.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.07.2013, 23:57     Iseq #4
Цитата Сообщение от ninja2 Посмотреть сообщение
Определите версию iseq() (параграф 18.3.1), для встроенных массивов istream и пар итераторов.
Там точно нет запятой после встроенных массивов? Ибо встроенных массивов istream звучит слишком бредово
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.07.2013, 00:49  [ТС]     Iseq #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Там точно нет запятой после встроенных массивов? Ибо встроенных массивов istream звучит слишком бредово
Да есть запятая. Да по коду вроде как видно что find нужно перезагрузить и для T* T*, где T это просто тип, наверно это имеется введу встроенный массив. Я почти сделал, я много перегружать не буду 3 алгоритма перегружу find find_if и mismatch, токо полностью перегружу. Это уже похоже по два шаблона нада один для функций и еще один для передаваемого типа (функциональный объект). От кусок кода никак в mismatch функцию свою не могу передать. Шаблоны создовать это головнят полный.
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
#include <iostream>
using std::cout;
using std::endl;
#include <list>
using std::list;
#include <algorithm>
using std::find;
using std::find_if;
using std::mismatch;
#include <string>
using std::string;
#include <utility>
using std::pair;
#include <functional>
using std::equal_to;
using std::bind2nd;
 
//Iseq для одной пары
template<class In> struct Iseq : public pair<In,In>
{
    In ii3;
    Iseq(In i1, In i2) : pair<In,In>(i1,i2),ii3(i2){}
    Iseq(In i1, In i2, In i3) : pair<In,In>(i1,i2),ii3(i3){}
};
//iseq для одной пары
template<class C> Iseq<typename C::iterator> iseq(C& c)//для всего контейнера
{
    return Iseq<typename C::iterator>(c.begin(),c.end());
}
//перегрузка для двух пар итераторов (функция)
template<class C> Iseq<typename C::iterator> iseq(C& c,C& c1)//для всего контейнера
{
    return Iseq<typename C::iterator>(c.begin(),c.end(),c1.begin());
}
 
//перегрузка find
template<class In,class T> In find(Iseq<In> r,const T& v)//расширение
{
    return find(r.first,r.second,v);
}
//перегрузка find_if
template<class In, class T> In find_if(Iseq<In> r,bool (*ptr)(T))
{
    return find_if(r.first,r.second,ptr);
}
//перегрузка mismatch
template<class In,class T> pair<In,In> mismatch(Iseq<In> r,bool(*ptr)(T))//,bool(*ptr)(T,T))
{
    //cout <<"mu tyt"<<endl;exit(1);
    //return pair<In,In>();
    return mismatch(r.first,r.second,r.ii3,ptr);//,ptr);
}
 
 
void f(list<string>& ls)
{
    list<string>::iterator p=find(ls.begin(),ls.end(),"standard");
    list<string>::iterator q=find(iseq(ls),"two");
    if(q!=ls.end())
        cout <<"*q= "<<*q<<endl;
    else
        cout <<"not find"<<endl;
    //...
}
 
//собственный предикат
bool pr(string a){return ("two"==a);}
bool pr1(int a,int b){return (a==b);}
 
int main()
{
    list<string> l;
    l.push_back("one");
    l.push_back("two");
    l.push_back("three");
    l.push_back("four");
 
    f(l);
 
    list<string>::iterator it;
    //iseq(l) l type list<string>
    //find
    it=find(iseq(l),"three");
    if(it!=l.end())
        cout <<"*it= "<<*it<<endl;//three
 
    //find_if
    it=find_if(l.begin(),l.end(),pr);
    it=find_if(iseq(l),pr);
 
    if(it!=l.end())
        cout <<"*it= "<<*it<<endl;//two
 
    //mismatch
    int mass[]={1,2,3,4,5};
    list<int> l1(mass,mass+5);
    int mass1[]={1,2,8,4,5};
    list<int> l2(mass1,mass1+5);
    pair<list<int>::iterator,list<int>::iterator> rez;
    //rez=mismatch(mass,mass+5,mass1,pr1);
    rez=mismatch(iseq(l1,l2),pr1);//,pr1);
    cout <<"*rez.first= "<<*rez.first<<" *rez.second= "<<*rez.second<<endl;
 
    return 0;
}
Добавлено через 59 секунд
Кто знает как pr1 добавить в mistmatch.

Добавлено через 5 минут
Да запусти шаблон, там параметр второй в функции забыл, давайте господа для полноты картины разберемся, что такое istream, и как например для них что то перегрузить или что тут в задачке имелось в веду, со всем вроде как то так смутно понятно, токо это осталось.

Добавлено через 1 минуту
Мне еще эта фигня кумарит когда вызывая шаблонную функцию явно не нужно задавать аргументы шаблона.

Добавлено через 31 минуту
Блин забыло формулу по которой определяется конец массива из его названия??
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.07.2013, 02:14     Iseq #6
Цитата Сообщение от ninja2 Посмотреть сообщение
Блин забыло формулу по которой определяется конец массива из его названия??
Эмм... это что-ли?
C++
1
2
3
4
template<typename T, std::size_t N>
T * end(T (&array)[N]) {
   return array + N;
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.07.2013, 03:11  [ТС]     Iseq #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Эмм... это что-ли?
нет эту
C++
1
2
int mass[5]={1,2,3,4,5};
int* end=mass+sizeof(int)+1;
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.07.2013, 03:30     Iseq #8
Цитата Сообщение от ninja2 Посмотреть сообщение
нет эту
Код C++
1
2
int mass[5]={1,2,3,4,5};
int* end=mass+sizeof(int)+1;
lol) может всё таки эту?
C++
1
int* end=mass+sizeof(mas);
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
15.07.2013, 03:38  [ТС]     Iseq #9
Цитата Сообщение от gray_fox Посмотреть сообщение
lol) может всё таки эту?
Да тут без разницы что sizeof(int), sizeof(mass) это одно и тоже mass то тип int значит размер его какой же как и int.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using std::cout;
using std::endl;
 
int main()
{
    int mass[]={1,2,3,4,5};
    int* nach=mass;
    int* end=mass+sizeof(int)+1;
 
    for(;nach!=end;nach++)
        cout <<*nach<<' ';
    cout <<endl;
 
    return 0;
}
Добавлено через 1 минуту
Ток попробовал с mass ошибка, нужно int с int нормально выводит
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.07.2013, 04:27     Iseq #10
ninja2, а если массив такой?
C++
1
int mass[]={1,2,3,4,5,6};
Так просто подгоняете под 5:
C++
1
int* end=mass+sizeof(int)+1;
Так нужно:
C++
1
 int* end = mass + sizeof(mass) / sizeof(int);
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.07.2013, 09:22     Iseq #11
С istream сделал бы как-то так пожалуй.

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
template<typename In>
struct iseq_t : std::pair<In, In>
{
   iseq_t(In f, In s) : std::pair<In, In>(f, s)
   {
   }
};
 
template<typename T>
iseq_t<std::istream_iterator<T> > iseq(std::istream& in)
{
   return iseq_t<std::istream_iterator<T> >(std::istream_iterator<T>(in), std::istream_iterator<T>());
}
 
template<typename In, typename T>
In find(iseq_t<In> seq, const T& value)
{
   return std::find(seq.first, seq.second, value);
}
 
int main()
{
   std::istringstream ss("1 2 3 4 5 6");
   std::cout << *find(iseq<int>(ss), 5) << std::endl;
}
Yandex
Объявления
15.07.2013, 09:22     Iseq
Ответ Создать тему
Опции темы

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