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

Итератор для собственного контейнера - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
14.05.2012, 16:33     Итератор для собственного контейнера #1
понимаю, что уже создан миллион подобных тем, НО я не вьехал в них.
мне необходимо реализовать собственный контейнер для использования его в алгоритмах stl
контейнер организовал, теперь необходимо реализовать итератор, совместимый с 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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <map>
#include <algorithm>
using namespace std;
 
template <class Type> class mas
{
    map <int, Type> m;  
    Type* makeptr(unsigned int ind)
    {
    return  &m.find(ind)->second;
    }   
    Type& make(unsigned int ind)
    {
        return m.find(ind)->second;
    }
    mas (const mas& source)
    {
        m=source.m;
    }
unsigned int minindex()
{
    int index=m.begin()->first;
        for(map<int,Type>::iterator iterat=m.begin();iterat!=m.end();iterat++)
                    if(index>iterat->first)
                         index=iterat->first;
        return index;
}
unsigned int maxindex()
{
        int index=m.begin()->first;
        for(map<int,Type>::iterator iterat=m.begin();iterat!=m.end();iterat++)
                    if(index<iterat->first)
                         index=iterat->first;
        return index;
}
public:
    class iterator{
                        unsigned int index;
                        mas<Type>* ptr;
                        public:
                        Type* operator++()
                        {
                            return ptr->makeptr(index++);
                        }
                        iterator operator--()
                        {
                            return ptr->makeptr(index--)
                        }
                        Type& operator*() {return ptr->make(index);}
                        Type* operator->(){return ptr->makeptr(index);}
                        bool operator==(const iterator& other) const {return index == other.index; }
                        bool operator!=(const iterator& other) const {return !(index == other.index); }
                        iterator(int a,mas<Type>* p)
                        {
                            ptr=p;
                            index=a;
                        }
 
                        };
    friend class mas::iterator;
mas(){}
Type& operator [](int index)
{
    map<int,Type>::iterator i=m.find(index);
    if(i==m.end())
    {
        Type something;
         m.insert(pair<int,Type>(index,something));
         i=m.find(index);
    }
    return i->second;; 
}
iterator Begin()
{
    mas::iterator it(minindex(),this);
    return it;
}
iterator End()
{
    mas::iterator it(maxindex()+1,this);
    return it;
}
};
 
void    fun (int a)
{
    cout<<a<<" ";
}
void main()
{
    mas <int> mass;
    for(int i=0;i<9;)
        cin>>mass[i++];
    //for_each(mass.Begin(),mass.End(),fun);
    for(mas<int>::iterator i=mass.Begin();i!=mass.End();i++)   
        cout<<*i<<" ";
    system("pause");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.05.2012, 16:46     Итератор для собственного контейнера #2
Форматируйте ж вы код-то.

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
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
 
template <class Type> class mas
{
    map <int, Type> m;  
    Type* makeptr(unsigned int ind)
    {
    return  &m.find(ind)->second;
    }   
    Type& make(unsigned int ind)
    {
        return m.find(ind)->second;
    }
    mas (const mas& source)
    {
        m=source.m;
    }
    unsigned int minindex()
    {
        int index=m.begin()->first;
        for(typename map<int,Type>::iterator iterat=m.begin();iterat!=m.end();iterat++)
                    if(index>iterat->first)
                         index=iterat->first;
        return index;
    }
    unsigned int maxindex()
    {
        int index=m.begin()->first;
        for(typename map<int,Type>::iterator iterat=m.begin();iterat!=m.end();iterat++)
                    if(index<iterat->first)
                         index=iterat->first;
        return index;
    }
public:
    class iterator
    {
      typedef Type value_type;
      typedef Type* pointer;
      typedef ptrdiff_t difference_type;
      typedef Type& reference;
      typedef std::bidirectional_iterator_tag iterator_category;
 
      unsigned int index;
      mas<value_type>* ptr;
      public:
      pointer operator++()
      {
          return ptr->makeptr(index++);
      }
      iterator operator--()
      {
         return ptr->makeptr(index--);
      }
      reference operator*() {return ptr->make(index);}
      pointer operator->(){return ptr->makeptr(index);}
      bool operator==(const iterator& other) const {return index == other.index; }
      bool operator!=(const iterator& other) const {return !(index == other.index); }
      iterator(int a,mas<value_type>* p)
      {
          ptr=p;
          index=a;
      }
   };
    friend class mas::iterator;
   mas(){}
   Type& operator [](int index)
   {
      typename map<int,Type>::iterator i=m.find(index);
      if(i==m.end())
      {
         Type something;
         m.insert(pair<int,Type>(index,something));
         i=m.find(index);
      }
      return i->second;; 
   }
   iterator begin()
   {
       mas::iterator it(minindex(),this);
       return it;
   }
   iterator end()
   {
       mas::iterator it(maxindex()+1,this);
       return it;
   }
};
 
void    fun (int a)
{
    cout << a << " ";
}
int main()
{
    mas <int> mass;
    for(int i=0;i<9;)
        cin>>mass[i++];
    for_each(mass.begin(),mass.end(),fun);
    /*for(mas<int>::iterator i=mass.begin();i!=mass.end();++i)   
        cout << *i <<" ";*/
    cout << endl;
    system("pause");
}
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
14.05.2012, 16:54  [ТС]     Итератор для собственного контейнера #3
C++
1
2
3
4
5
Ошибка  1   error C2248: mas<Type>::iterator::iterator_category: невозможно обратиться к private typedef, объявленному в классе "mas<Type>::iterator"   c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility 373
Ошибка  2   error C2248: mas<Type>::iterator::value_type: невозможно обратиться к private typedef, объявленному в классе "mas<Type>::iterator"  c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility 374
Ошибка  3   error C2248: mas<Type>::iterator::difference_type: невозможно обратиться к private typedef, объявленному в классе "mas<Type>::iterator" c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility 375
Ошибка  4   error C2248: mas<Type>::iterator::pointer: невозможно обратиться к private typedef, объявленному в классе "mas<Type>::iterator" c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility 377
Ошибка  5   error C2248: mas<Type>::iterator::reference: невозможно обратиться к private typedef, объявленному в классе "mas<Type>::iterator"   c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility 378
visual studio 2010
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.05.2012, 17:27     Итератор для собственного контейнера #4
vaselo, Поставьте public перед typedef-ами в классе итератора.
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
14.05.2012, 18:39  [ТС]     Итератор для собственного контейнера #5
расширил возможности моего итератора до random access iterator (коряво в плане того, что при обращении к несуществ. индексу память будет выделяться. с этим справлюсь позже)
но снова вылетают ошибки. что не так?

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
#include "stdafx.h"
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
 
template <class Type> class mas
{
    map <int, Type> m;  
    Type* makeptr(unsigned int ind)
    {
    return  &m.find(ind)->second;
    }   
    Type& make(unsigned int ind)
    {
        return m.find(ind)->second;
    }
    mas (const mas& source)
    {
        m=source.m;
    }
    unsigned int minindex()
    {
        int index=m.begin()->first;
        for(typename map<int,Type>::iterator iterat=m.begin();iterat!=m.end();iterat++)
                    if(index>iterat->first)
                         index=iterat->first;
        return index;
    }
    unsigned int maxindex()
    {
        int index=m.begin()->first;
        for(typename map<int,Type>::iterator iterat=m.begin();iterat!=m.end();iterat++)
                    if(index<iterat->first)
                         index=iterat->first;
        return index;
    }
public:
    class iterator
    {
    public:
      typedef Type value_type;
      typedef Type* pointer;
      typedef ptrdiff_t difference_type;
      typedef Type& reference;
      typedef std::bidirectional_iterator_tag iterator_category;
 
      unsigned int index;
      mas<value_type>* ptr;
      public:
      pointer operator++()
      {
          return ptr->makeptr(index++);
      }
      iterator operator--()
      {
         return ptr->makeptr(index--);
      }
      reference operator*() {return ptr->make(index);}
      pointer operator->()  {return ptr->makeptr(index);}
      bool operator==(const iterator& other) const {return index == other.index; }
      bool operator!=(const iterator& other) const {return !(index == other.index); }
      bool operator<(const  iterator other){return index<other.index;}
      bool operator<=(const iterator other){return index<=other.index;}
      bool operator>(const  iterator other){return index>other.index;}
      bool operator>=(const iterator other){return index>=other.index;}
      pointer operator+ (const int n){return ptr->makeptr(index+n);}
      pointer operator- (const int n){return ptr->makeptr(index-n);}
      pointer operator+=(const int n){return ptr->makeptr(index+=n);}
      pointer operator-=(const int n){return ptr->makeptr(index-=n);}
      reference operator[](int i){return ptr->make(i);}
      operator int(){return index;}
      iterator(int a,mas<value_type>* p)
    
      {
          ptr=p;
          index=a;
      }
   };
    friend class mas::iterator;
   mas(){}
   Type& operator [](int index)
   {
      typename map<int,Type>::iterator i=m.find(index);
      if(i==m.end())
      {
         Type something;
         m.insert(pair<int,Type>(index,something));
         i=m.find(index);
      }
      return i->second;; 
   }
   iterator begin()
   {
       mas::iterator it(minindex(),this);
       return it;
   }
   iterator end()
   {
       mas::iterator it(maxindex()+1,this);
       return it;
   }
};
 
void  fun (int a)
{
    cout << a << " ";
}
int main()
{
    mas <int> mass;
    for(int i=0;i<9;)
        cin>>mass[i++];
    sort(mass.begin(),mass.end(),fun);
    //for(mas<int>::iterator i=mass.begin();i<mass.end();++i)   
     // cout << *i <<" ";
    cout << endl;
    system("pause");
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.05.2012, 19:03     Итератор для собственного контейнера #6
vaselo, Категорию-то поменяйте на std::random_access_iterator_tag.
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
14.05.2012, 19:40  [ТС]     Итератор для собственного контейнера #7
сменил, но... те же ошибки


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
#include "stdafx.h"
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
 
template <class Type> class mas
{
    map <int, Type> m;  
    Type* makeptr(unsigned int ind)
    {
    return  &m.find(ind)->second;
    }   
    Type& make(unsigned int ind)
    {
        if( m.find(ind)!=End())
            return m.find(ind)->second;
        else 
        {
            Type something;
             m.insert(pair<int,Type>(index,something));
            i=m.find(index);
        }
    }
    mas (const mas& source)
    {
        m=source.m;
    }
    unsigned int minindex()
    {
        int index=m.begin()->first;
        for(typename map<int,Type>::iterator iterat=m.begin();iterat!=m.end();iterat++)
                    if(index>iterat->first)
                         index=iterat->first;
        return index;
    }
    unsigned int maxindex()
    {
        int index=m.begin()->first;
        for(typename map<int,Type>::iterator iterat=m.begin();iterat!=m.end();iterat++)
                    if(index<iterat->first)
                         index=iterat->first;
        return index;
    }
public:
    class iterator
    {
    public:
      typedef Type value_type;
      typedef Type* pointer;
      typedef ptrdiff_t difference_type;
      typedef Type& reference;
      typedef std::random_access_iterator_tag iterator_category;
 
      unsigned int index;
      mas<value_type>* ptr;
      public:
      pointer operator++()
      {
          return ptr->makeptr(index++);
      }
      iterator operator--()
      {
         return ptr->makeptr(index--);
      }
      reference operator*() {return ptr->make(index);}
      pointer operator->()  {return ptr->makeptr(index);}
      bool operator==(const iterator& other) const {return index == other.index; }
      bool operator!=(const iterator& other) const {return !(index == other.index); }
      bool operator<(const  iterator other){return index<other.index;}
      bool operator<=(const iterator other){return index<=other.index;}
      bool operator>(const  iterator other){return index>other.index;}
      bool operator>=(const iterator other){return index>=other.index;}
      pointer operator+ (const int n){return ptr->makeptr(index+n);}
      pointer operator- (const int n){return ptr->makeptr(index-n);}
      pointer operator+=(const int n){return ptr->makeptr(index+=n);}
      pointer operator-=(const int n){return ptr->makeptr(index-=n);}
      reference operator[](int i){return ptr->make(i);}
      operator int(){return index;}
      iterator(int a,mas<value_type>* p)
    
      {
          ptr=p;
          index=a;
      }
   };
    friend class mas::iterator;
   mas(){}
   Type& operator [](int index)
   {
      typename map<int,Type>::iterator i=m.find(index);
      if(i==m.end())
      {
         Type something;
         m.insert(pair<int,Type>(index,something));
         i=m.find(index);
      }
      return i->second;; 
   }
   iterator begin()
   {
       mas::iterator it(minindex(),this);
       return it;
   }
   iterator end()
   {
       mas::iterator it(maxindex()+1,this);
       return it;
   }
};
 
void  fun (int a)
{
    cout << a << " ";
}
int main()
{
    mas <int> mass;
    for(int i=0;i<9;)
        cin>>mass[i++];
    sort(mass.begin(),mass.end(),fun);
    //for(mas<int>::iterator i=mass.begin();i<mass.end();++i)   
     // cout << *i <<" ";
    cout << endl;
    system("pause");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2012, 20:18     Итератор для собственного контейнера
Еще ссылки по теме:

C++ Итератор контейнера set
C++ Степенной метод нахождения наибольшего по модулю собственного значения и соответствующего ему собственного вектора
C++ STL итератор на конец контейнера

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.05.2012, 20:18     Итератор для собственного контейнера #8
1. Операторы + или -, а так же += и -= должны возвращать итератор, а не указатель.
2. Насколько я помню принимать они должны difference_type.
Yandex
Объявления
14.05.2012, 20:18     Итератор для собственного контейнера
Ответ Создать тему
Опции темы

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