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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти сумму ряда с заданной точностью c http://www.cyberforum.ru/cpp-beginners/thread568045.html
Найти сумму ряда с заданной точностью. Точность и значение переменной х вводить с клавиатуры. Осуществить проверку ошибок ввода. Считать ошибочными значения х, которые приводят к расхождению ряда. Почти такой но не получается , помогите #include <conio.h> #include <stdio.h> void main(){ clrscr(); printf("‚¢¥¤¨â¥ â®ç*®áâì: "); float eps;
C++ Метод броуновского моделирования Здравствуйте. Суть проблемы такова: нужно реализовать метод броуновского блуждания ансамбля частиц в миллион штук. Как задать этот ансамбль? Вектором или массивом? http://www.cyberforum.ru/cpp-beginners/thread568037.html
Получить все сочетания из 10 элементов 1, ..., 10, по 4 элемента в каждом. C++
Получить все сочетания из 10 элементов 1, ..., 10, по 4 элемента в каждом.
Создание диалогового окна из DLL C++
Доброго всем времени! Ситуация следующая: Создаю DLL для внешнего приложения, которая обменивается с ним сообщениями (плагин). Возникла необходимость настройки моего плагина, решил сделать диалоговое окно с настройками, которое должно появляться в ответ на запрос этого самого внешнего приложения. Из-за нехватки опыта, для меня пока непонятно, есть ли разница для сабжа в расширении моей...
C++ Ошибка: error LNK2019: unresolved external symbol http://www.cyberforum.ru/cpp-beginners/thread568017.html
В общем делаю курсач, есть фунция ввода списка, но тут такая проблема: у меня не компилируется, то что я написал(точнее LINK не проходит) с ошибками: 1>курсовая.obj : error LNK2019: unresolved external symbol "void __cdecl inputs(char *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)"...
C++ Адресная книга Дали задание создать класс с добавлением, удалением и выводом знчаений на экран...и это все в динамическом массиве да и еще ассоциативно. Не подскажите, с чего бы начать?что обязательно помимо класса должно быть в программе? подробнее

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

необходимо создать итератор, НО: в связи с тем, что мой контейнер создан из набора элементарных массивов, то ++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];
}
Миниатюры
Итератор для массива  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru