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

Итератор для массива - C++

Восстановить пароль Регистрация
 
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
07.05.2012, 19:18     Итератор для массива #1
Доброго времени суток, дорогие форумчане!
К сожалению, снова вынужден просить у вас помощи:

необходимо создать итератор, НО: в связи с тем, что мой контейнер создан из набора элементарных массивов, то ++ptr применять не удается - необходимо переходить по блокам.

мой контейнер - динамический массив, т.е. можно обратиться к любому индексу массива (если индекс больше размера массива - массив расширится до необходимого размера, путем добавления блоков памяти - маленьких массивов) но если в данный блок массива не пишутся данные - для блока память не выделяется.

есть внутри контейнера 2 вектора: вектор указателей на тип ( называется vect) и булевский вектор по имени bvect
i-тый блок существует (выделена память), если i-тый эл-т булевского вектора - Истина (смотреть фото)

просто сам итератор - вложен в описание контейнера и не имеет доступа к этим векторам, следовательно к данным
как мне быть? мне надо переходить по всем элементам массива (по тем блокам, под которые выделена память)
кого не испугало, помогите, пожалуйста!


сам код:
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 <stdio.h>
#include <vector>
using namespace std;
 
template <class Type> class mas
{
    Type* ptr;
public:
    struct iterator {
    Type *ptr;
    iterator (Type* ptr_=0) : ptr(ptr_) {}
    Type& operator*() { return *ptr; }
    Type* operator->() { return ptr; }
    Type* operator++() {return ++ptr; }
    Type* operator--() { return --ptr; }
    bool operator==(const iterator& other) const { return ptr == other.ptr; }
    bool operator!=(const iterator& other) const { return !(*this == other); }
  };
private:
    vector <Type*> vect;
    vector <bool>  bvect;
    unsigned int size_of_block;
    unsigned int size;
    unsigned int count_of_blocks;
int CountOfBlocks()
{
    return count_of_blocks;
}
int SizeOfBlock()
{
    return size_of_block;
}
mas(const mas& source)
    {
        if(size>source.Size()) // обрезаем лишнее
            Cut(source.Size());     
        size_of_block=source.SizeOfBlock();
        for(int i=0;i<count_of_blocks;i++)
                {
                    delete vect[i];
                    vect.erase(i);
                }
        for(int j=0;j<size;j++)
            [j]=source[j];
        count_of_blocks=source.CountOfBlocks();
        bvect=source.bvect;
        int i=0;
        while(i<bvect.size)
            if(bvect[i++]==false)
                delete vect[i-1];
}
public:
iterator begin() {return vect.begin()[0];}
iterator end() { return vect.back()[size_of_block-1];}
int Size()
{
    return size;
}
mas()
    {
        count_of_blocks=1;
        size_of_block=50;
        size=50;
        Type*p=new Type[size_of_block];
        vect.push_back(p);
        bvect.push_back(true);
    }
mas(unsigned int _size)
    {
        count_of_blocks=1;
        size_of_block=_size;
        size=size_of_block;
        Type* p=new Type[size_of_block];
        vect.push_back(p);
        bvect.push_back(true);
    }
Type& operator[](int index)
{
    if(index>size)
    {
        Type* p;
        while(index/size_of_block>count_of_blocks)
        {
            vect.push_back(p);
            count_of_blocks++;
            size+=size_of_block;
            bvect.push_back(false);
        }
            p=new Type[size_of_block];
            vect.push_back(p);
            count_of_blocks++;
            size+=size_of_block;
            bvect.push_back(true);
    }
if(bvect[index/size_of_block]==false)
    {
        bvect[index/size_of_block]=true;
        vect[index/size_of_block]=new Type[size_of_block];
    }
    return vect[index/size_of_block][index%size_of_block];
}
void Cut(int newsize)
{
    int needed_cnt=newsize/size_of_block;
    if(needed_cnt<count_of_blocks)
    {
        while(count_of_blocks>needed_cnt)
        {
            delete vect[--count_of_blocks];
            vect.pop_back();
            bvect.pop_back();
        }
    }
    size=newsize;
}
};
void main()
{
    mas <int> mass;
    mas<int>::iterator i=mass.begin();
    mass[0]=123;
    cout<<*i;
    cin>>mass[2];
}
Миниатюры
Итератор для массива  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
07.05.2012, 19:26  [ТС]     Итератор для массива #2
скажем проще: мне надо получить доступ из вложенного в контейнер итератора к остальным данным-членам этого контейнера
modwind
 Аватар для modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
07.05.2012, 20:18     Итератор для массива #3
vaselo, зачем вручную управлять выделением памяти? Если некоторые элементы могут отсутствовать и хочется сэкономить, попробуй std::map<size_t, int>.

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <map>
#include <iostream>
 
int main()
{
    std::map<size_t, int> mass;
    mass[0]=123;
    std::map<size_t, int>::iterator i=mass.begin();
    std::cout<<i->second;
    std::cin>>mass[2];
    return 0;
}
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
07.05.2012, 23:53  [ТС]     Итератор для массива #4
необходимо довести до ума этот код:
добавить в него итератор, имеющий доступ к остальным членам контейнера (чтоб мог обращаться к vect и bvect)

Добавлено через 3 часа 23 минуты
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
127
128
129
130
131
132
133
134
135
136
137
138
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
 
template <class Type> class mas
{
public:
    class iterator {
    mas* masive;
    public:
    int index;
    void Setmas(mas* m){masive=m;}
    Type& operator*() { return masive[index];}           в этих строках
    Type* operator->() { return &masive[index];}        ошибка: возвращаемый параметр - явный -инт. невозможно совместить с Type
    Type* operator++() {index++; return mas[index]; }
    Type* operator--() {index--; return mas[index]; }
    bool operator==(const iterator& other) const {return index == other.index; }
    bool operator!=(const iterator& other) const {return !(index == other.index); }
  };
private:
    vector <Type*> vect;
    vector <bool>  bvect;
    unsigned int size_of_block;
    unsigned int size;
    unsigned int count_of_blocks;
int CountOfBlocks()
{
    return count_of_blocks;
}
mas(const mas& source)
    {
        if(size>source.Size()) // обрезаем лишнее
            Cut(source.Size());     
        size_of_block=source.SizeOfBlock();
        for(int i=0;i<count_of_blocks;i++)
                {
                    delete vect[i];
                    vect.erase(i);
                }
        for(int j=0;j<size;j++)
            [j]=source[j];
        count_of_blocks=source.CountOfBlocks();
        bvect=source.bvect;
        int i=0;
        while(i<bvect.size)
            if(bvect[i++]==false)
                delete vect[i-1];
}
public:
iterator begin()
{   iterator it;
    it.Setmas(this);
    it.index=0;
    return it;
}
iterator end()
{
    iterator it;
    it.Setmas(this);
    it.index=masive.Size();
    return it;
}
int SizeOfBlock()
{
    return size_of_block;
}
int Size()
{
    return size;
}
mas()
    {
        count_of_blocks=1;
        size_of_block=50;
        size=50;
        Type*p=new Type[size_of_block];
        vect.push_back(p);
        bvect.push_back(true);
    }
mas(unsigned int _size)
    {
        count_of_blocks=1;
        size_of_block=_size;
        size=size_of_block;
        Type* p=new Type[size_of_block];
        vect.push_back(p);
        bvect.push_back(true);
    }
Type& operator[](int index)
{
    if(index>size)
    {
        Type* p;
        while(index/size_of_block>count_of_blocks)
        {
            vect.push_back(p);
            count_of_blocks++;
            size+=size_of_block;
            bvect.push_back(false);
        }
            p=new Type[size_of_block];
            vect.push_back(p);
            count_of_blocks++;
            size+=size_of_block;
            bvect.push_back(true);
    }
if(bvect[index/size_of_block]==false)
    {
        bvect[index/size_of_block]=true;
        vect[index/size_of_block]=new Type[size_of_block];
    }
    return vect[index/size_of_block][index%size_of_block];
}
void Cut(int newsize)
{
    int needed_cnt=newsize/size_of_block;
    if(needed_cnt<count_of_blocks)
    {
        while(count_of_blocks>needed_cnt)
        {
            delete vect[--count_of_blocks];
            vect.pop_back();
            bvect.pop_back();
        }
    }
    size=newsize;
}
};
void main()
{
    mas <int> mass;
    mas<int>::iterator i=mass.begin();
    mass[0]=123;
    cout<<*i;
    cin>>mass[2];
}
я в итератор положил указатель на контейнер и за данными - обращаюсь к нему, но с типами лажа (см. код. там указано сбойное место)
как устранить это??
Yandex
Объявления
07.05.2012, 23:53     Итератор для массива
Ответ Создать тему
Опции темы

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