- •Основы ооп. Понятие инкапсуляции, наследования и полиморфизма.
- •Класс в ооп и его основные компоненты.
- •Перегрузка функций.
- •Уровни доступа к элементам класса.
- •Область видимости объектов, скрытие имен.
- •Динамическая память, функции работы с памятью.
- •Динамическая память, операции работы с памятью.
- •Передача аргументов в функцию по умолчанию.
- •11. Характеристика элементов-данных класса.
- •13. Указатель «this». Пример явного использования.
- •Void load_i (int val) {
- •14. Функции-друзья класса.
- •15. Функции-конструкторы. Явный и косвенный вызов конструктора.
- •16. Функции-деструкторы.
- •17. Методы класса с атрибутом «const».
- •18. Статические методы и данные. Атрибут «static»
- •23. Виртуальный базовый класс.
- •25. Виртуальные функции. Переопределение виртуальных функций.
- •26. Понятие абстрактного класса.
- •27. Перегрузка операций.
- •28. Особенности перегрузки операций при помощи методов класса и функций-друзей.
- •29. Перегрузка методами класса.
- •30. Использование ссылок при перегрузке унарных операций.
- •31. Стандартная библиотека. Общая характеристика.
- •32. Строковый класс стандартной библиотеки.
- •2. String (const char *str);
- •3. String (const string &str);
- •Insert() - вставка символов одной строки в другую
- •33. Контейнерные классы.
- •Vector - динамический массив
- •34. Итераторы.
- •Категории итераторов
- •Операции доступные итераторам
- •35. Алгоритмы.
- •36. Потоковые классы.
- •37. Управление выводом. Манипуляторы и флажки.
- •38. Файловые потоки.
- •39. Шаблоны функций
- •40. Шаблоны классов.
- •41. Обработка исключений. Общая характеристика.
- •42. Вложенные классы.
- •43. Классы и указатели при наследовании.
- •44. Многократная перегрузка операций.
- •46. Указатель типа «void».
- •47. Адрес в качестве возвращаемого значения функции.
- •48. Операция «typeid».
- •49. Виды обработчиков исключительных операций.
- •50. Отличие вызова функций от вызова обработчика исключительной ситуации.
- •51. Создание собственного завершающего кода при перехвате исключительной ситуации.
- •52. Форма конструктора со списком инициализации.
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;
}