Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы все_001.doc
Скачиваний:
7
Добавлен:
25.09.2019
Размер:
238.59 Кб
Скачать

33. Контейнерные классы.

Контейнеры представляют собой объекты STL, которые содержат другие объекты.

Контейнерные классы -- это универсальные шаблонные классы, предназначенные для хранения элементов заданного типа в смежных областях памяти. Стандарт C++ уже включает в себя большое количество контейнеров, как часть STL (Standard Template Library -- Стандартная Библиотека Шаблонов).

Контейнеры, определенные в STL :

bitset - битовое множество

beque - очередь с двусторонним доступом

list - линейный стек

map - хранит пары «ключ-значение»

Vector - динамический массив

и другие.

34. Итераторы.

Для доступа к элементам некоторого множества алгоритмы STL используют специальные объекты, называемые итераторами. В контейнерных типах STL они доступны через методы класса (например, begin() в шаблоне класса vector. Функциональные возможности указателей и итераторов близки, так что обычный указатель тоже может использоваться как итератор.

Категории итераторов

  • итератор ввода (input iterator) - используется потоками ввода;

  • итератор вывода (output iterator) - используется потоками вывода;

  • однонаправленный итератор (forward iterator) - для прохода по элементам в одном направлении;

  • двунаправленный итератор (bidirectional iterator) - способен пройтись по элементам в любом направлении. Такие итераторы реализованы в некоторых контейнерных типах stl (list, set, multiset, map, multimap);

  • итераторы произвольного доступа (random access) - через них можно иметь доступ к любому элемента. Такие итераторы реализованы в некоторых контейнерных типах stl (vector, deque, string, array).

Операции доступные итераторам

Операция

RIt

InIt

OutIt

FIt

BIt

*it

+

+

-

+

+

*it=val

-

-

+

-

-

it->mem

+

+

-

+

+

++it

+

+

+

+

+

it++

+

+

+

+

+

--it

+

-

-

-

+

it--

+

-

-

-

+

it1==it2

+

+

-

+

+

it1!=it2

+

+

-

+

+

con ()

+

-

-

+

+

con (it)

+

+

+

+

+

it[]

+

-

-

-

-

it+=val

+

-

-

-

-

it-=val

+

-

-

-

-

it+val

+

-

-

-

-

it-val

+

-

-

-

-

it1-it2

+

-

-

-

-

it1<it2

+

-

-

-

-

it1>it2

+

-

-

-

-

it1<=it2

+

-

-

-

-

it1>=it2

+

-

-

-

-

Кроме операций для итераторов определены три функции:

  • advance (InIt& pos, dist n) - перемещает итератор на указанную дистанцию;

  • dist distance (InIt pos1, InIt pos2) - вычисляет дистанцию между двумя итераторами;

  • iter_swap (FIt1 pos1, FIt2 pos2) - обменивает значения указанных итераторов.

С помощью этого итератора вы можете работать с 'окнами' внутри двухмерного массива. Так здесь с помощью fill заполняется окно 3x3 с координатами (2,2) внутри массива 10x10.

#include <iostream>

#include <iterator>

#include <algorithm>

using namespace std;

// T - тип объекта, содержащего элементы

// Tval - тип элементов

template <typename T,typename Tval>

class It2d: public std::iterator

<std::forward_iterator_tag, T> {

protected:

T& datab; // объект с элементами, и с операцией[]

int posbeg; // с какого элемента

int width; // полная ширина

int w; // ширина окна

int i; // текущая позиция

public:

It2d(T& ddatab, int pposbeg, int wwidth,

int ww, int pos=0): datab(ddatab){

width=wwidth;

w=ww;

posbeg=pposbeg;

i=pos;

}

It2d(const It2d<T,Tval>& a):datab(a.datab){

width=a.width;

w=a.w;

i=a.i;

posbeg=a.posbeg;

}

//----------------------------------

Tval& operator *(){

return datab[posbeg+i%w+i/w*width];

}

It2d<T,Tval>&operator ++(){

++i;

return *this;

}

It2d<T,Tval>& operator ++(int a){

++i;

return *this;

}

bool operator ==(It2d<T,Tval> &it){

return datab==it.datab && i==it.i &&

w==it.w && width==it.width;

}

bool operator !=(It2d<T,Tval>&it){

return !(*this==it);

}

};

void out(int*data){

for(int i=0;i<10;i++){

for(int j=0;j<10;j++)

cout<<data[j+i*10];

cout<<endl;

}

}

int main(){

int *data=new int[10*10];

std::fill(data,data+100,1);

out(data);

It2d<int*,int> begin(data,10*2+2,10,3);

It2d<int*,int> end(data,10*2+2,10,3,9);

std::fill(begin,end,2);

cout<<"=========="<<endl;

out(data);

return 0;

}