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

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

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

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

07.05.2012, 19:18. Просмотров 1325. Ответов 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];
}
Миниатюры
Итератор для массива  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2012, 19:18     Итератор для массива
Посмотрите здесь:

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

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

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

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

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

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

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

Итератор для односвязного спика - C++
Есть функция в классе итератор int operator-(iterator* q) она должна возвращать разницу сколько расстояние между двумя итераторами...

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

Класс итератор для стека - C++
Доброго времени суток! Обращаюсь к вам за помощью. Хоть сама в тему эту не совсем влилась, прошу гляньте код. Ругается, но я...

Итератор для бинарного дерева - C++
Расскажите, что из себя представляет класс итератор. Какие базовые функции он должен содержать применительно для работы с бинарным деревом?...

Создать итератор для списка - C++
:- //ListNode.h #ifndef LISTNODE_H #define LISTNODE_H template &lt;typename NODETYPE&gt; class List; template &lt;typename NODETYPE&gt; ...

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


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

Или воспользуйтесь поиском по форуму:
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     Итератор для массива
Ответ Создать тему
Опции темы

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