Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
19 / 19 / 5
Регистрация: 17.10.2010
Сообщений: 247
1

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

14.05.2012, 16:33. Просмотров 2672. Ответов 7
Метки нет (Все метки)

понимаю, что уже создан миллион подобных тем, НО я не вьехал в них.
мне необходимо реализовать собственный контейнер для использования его в алгоритмах 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");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2012, 16:33
Ответы с готовыми решениями:

Итератор для контейнера
Собственно, интересует такой вопрос: &quot;Как создать собственный класс-итератор для контейнера?&quot;....

Итератор контейнера set
Здравствуйте! Каким образом можно изменить значение итератора set на n (кроме вызова ++ n раз)....

Итератор контейнера по связанным типам
Здравствуйте! Есть объект сущность, который содержит в себе некоторое количество компонентов....

STL итератор на конец контейнера
Подскажите пожалуйста у меня задача сделать дерево и слизать интерфейс с STL std::map. Вопрос в...

7
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
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");
}
1
19 / 19 / 5
Регистрация: 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
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
14.05.2012, 17:27 4
vaselo, Поставьте public перед typedef-ами в классе итератора.
1
19 / 19 / 5
Регистрация: 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");
}
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
14.05.2012, 19:03 6
vaselo, Категорию-то поменяйте на std::random_access_iterator_tag.
1
19 / 19 / 5
Регистрация: 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");
}
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
14.05.2012, 20:18 8
1. Операторы + или -, а так же += и -= должны возвращать итератор, а не указатель.
2. Насколько я помню принимать они должны difference_type.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2012, 20:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Итератор контейнера внутреннего класса шаблона
Следующий код компилируется: struct A { struct B {}; vector&lt;B&gt; vec; vector&lt;B&gt;::iterator...

Вывод контейнера указателей через потоковый итератор
Доброго дня всем. Собственно: std::list&lt;int*&gt; list; list.push_back(new int(45));...

Написание собственного контейнера
Доброго времени суток ! Помогите написать собственный контейнер, основанный на STL, ибо сам с...

Как сделать, чтобы итератор указывал на определенный элемент контейнера?
как сделать, чтобы итератор указывал на, допустим, пятый элемент контейнера (вектора)


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

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

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