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

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

Войти
Регистрация
Восстановить пароль
 
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
#1

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

07.05.2012, 19:18. Просмотров 1431. Ответов 3
Метки нет (Все метки)

Доброго времени суток, дорогие форумчане!
К сожалению, снова вынужден просить у вас помощи:

необходимо создать итератор, НО: в связи с тем, что мой контейнер создан из набора элементарных массивов, то ++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];
}
0
Миниатюры
Итератор для массива  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2012, 19:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Итератор для массива (C++):

Реализовать двусвязный список (list), итератор (iterator) и константный итератор (сonst_iterator) для списка - C++
не могу понять что должно быть результатом. может подскажете примеры? пожалуйста. Задание: Реализовать двусвязный список (list),...

Можно ли использовать итератор для обычного массива? - C++
Можно ли использовать итератор для обычного массива? Если да, то как его объявить?

Вновь итератор. реализация для динамического массива - C++
Реализовываю по заданию контейнер-шаблон растущий массив. В принципе, ничего сложно и непонятного, кроме одной вещи(для меня:)): ...

Парсинг математических выражений - Итератор: выход за пределы массива - C++
Всем привет, задача написать класс для парсинга мат. выражений (+,-,/,*); По идее выражение задается конструктору, функция eval...

Итератор для списка - C++
#include &lt;iostream&gt; using namespace std; template &lt;class T&gt; class Link { public: T value; Link *nextLink; Link( T v,...

Итератор для вектора - C++
Привет, столкнулся с тем что при использовании stl вектора понадобился итератор перехода на элемент через индекс. не могли бы вы привести...

3
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
07.05.2012, 19:26  [ТС] #2
скажем проще: мне надо получить доступ из вложенного в контейнер итератора к остальным данным-членам этого контейнера
0
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;
}
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];
}
я в итератор положил указатель на контейнер и за данными - обращаюсь к нему, но с типами лажа (см. код. там указано сбойное место)
как устранить это??
0
07.05.2012, 23:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2012, 23:53
Привет! Вот еще темы с ответами:

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

Итератор для собственного контейнера - C++
понимаю, что уже создан миллион подобных тем, НО я не вьехал в них. мне необходимо реализовать собственный контейнер для использования...

Итератор для двумерных векторов - C++
Решил навелосипедить iterator2d...столкнулся с проблемой: как должны выглядеть операторы * и -&gt; Вот есть такой набросок: #ifndef...

Итератор для класса с массивом - C++
Добрый день! Есть небольшая задачка.. необходимо написать класс для готовых комманд код for (Ada::Iterator adaIter =...


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

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

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