Скачиваний:
12
Добавлен:
01.05.2014
Размер:
1.03 Mб
Скачать

Список наиболее долго выполнявшихся функцийЭ

Func Func+Child Hit

Time % Time % Count Function

---------------------------------------------------------

322,606 72,6 322,606 72,6 806 std::basic_streambuf<char,struct std::char_traits<char> >::xsputn(char const *,int) (point.obj)

54,620 12,3 58,505 13,2 456 std::basic_ostream<char,struct std::char_traits<char> >::put(char) (lab1_3.obj)

28,430 6,4 28,442 6,4 831 std::ostreambuf_iterator<char,struct std::char_traits<char> >::operator=(char) (lab1_3.obj)

19,310 4,3 437,939 98,6 1 _main (lab1_3.obj)

6,130 1,4 19,799 4,5 276 std::num_put<char,class std::ostreambuf_iterator<char,struct std::char_traits<char> > >::_Fput(class std::ostreambuf_iterator<char,struct std::char_traits<char> >,class std::ios_base &,char,char const *,unsigned int,unsigned int) (lab1_3.obj)

3,883 0,9 3,883 0,9 1890 std::basic_ostream<char,struct std::char_traits<char> >::opfx(void) (lab1_3.obj)

2,996 0,7 22,795 5,1 276 std::num_put<char,class std::ostreambuf_iterator<char,struct std::char_traits<char> > >::do_put(class std::ostreambuf_iterator<char,struct std::char_traits<char> >,class std::ios_base &,char,double) (lab1_3.obj)

2,768 0,6 2,768 0,6 980 std::ios_base::getloc(void) (lab1_3.obj)

0,770 0,2 14,222 3,2 349 std::num_put<char,class std::ostreambuf_iterator<char,struct std::char_traits<char> > >::do_put(class std::ostreambuf_iterator<char,struct std::char_traits<char> >,class std::ios_base &,char,unsigned long) (lab1_3.obj)

0,446 0,1 0,446 0,1 276 std::num_put<char,class std::ostreambuf_iterator<char,struct std::char_traits<char> > >::_Rep(class std::ostreambuf_iterator<char,struct std::char_traits<char> >,char,unsigned int) (lab1_3.obj)

0,330 0,1 70,972 16,0 23 Point::Point(double,double) (point.obj)

0,260 0,1 0,152 0,0 86 std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> >::str(void) (point.obj)

0,234 0,1 3,516 0,8 6 Text::Text(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >) (text.obj)

0,211 0,0 0,211 0,0 355 std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Copy(unsigned int) (lab1_3.obj)

0,201 0,0 0,000 0,0 58 std::operator+(char const *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &) (line.obj)

0,170 0,0 0,165 0,0 12 Text::toString(void) (text.obj)

0,145 0,0 104,645 23,6 40 Point::~Point(void) (point.obj)

0,137 0,0 0,135 0,0 560 std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,unsigned int,unsigned int) (lab1_3.obj)

0,136 0,0 17,416 3,9 2 [thunk]:TextInTriangle::moveBy`vtordisp{-4,0}' (double,double) (textintriangle.obj)

0,104 0,0 25,986 5,8 276 std::basic_ostream<char,struct std::char_traits<char> >::operator<<(double) (line.obj)

0,099 0,0 0,099 0,0 980 std::locale::id::operator unsigned int(void) (lab1_3.obj)

0,060 0,0 10,595 2,4 4 printShapeObjectStats(void) (lab1_3.obj)

0,031 0,0 6,536 1,5 3 [thunk]:Line::print`vtordisp{-4,0}' (class std::basic_ostream<char,struct std::char_traits<char> > &) (line.obj)

0,026 0,0 50,001 11,3 5 Line::Line(class Point *,class Point *) (line.obj)

0,023 0,0 22,042 5,0 2 Triangle::Triangle(void) (triangle.obj)

0,020 0,0 122,027 27,5 37 [thunk]:Point::`vector deleting destructor'`vtordisp{-4,0}' (unsigned int) (point.obj)

0,013 0,0 0,013 0,0 86 std::basic_stringbuf<char,struct std::char_traits<char>,class std::allocator<char> >::overflow(int) (point.obj)

0,012 0,0 21,523 4,8 3 Line::Line(void) (line.obj)

0,009 0,0 63,286 14,2 4 Triangle::Triangle(class Point *,class Point *,class Point *) (triangle.obj)

0,008 0,0 31,059 7,0 3 createRandomShape(void) (lab1_3.obj)

0,008 0,0 0,008 0,0 3 Point::operator=(class Point const &) (point.obj)

0,008 0,0 0,045 0,0 3 std::num_put<char,class std::ostreambuf_iterator<char,struct std::char_traits<char> > >::do_put(class std::ostreambuf_iterator<char,struct std::char_traits<char> >,class std::ios_base &,char,long) (lab1_3.obj)

0,006 0,0 0,000 0,0 1 std::num_put<char,class std::ostreambuf_iterator<char,struct std::char_traits<char> > >::num_put<char,class std::ostreambuf_iterator<char,struct std::char_traits<char> > >(unsigned int) (lab1_3.obj)

0,006 0,0 3,187 0,7 6 Text::~Text(void) (text.obj)

Разработка шаблон контейнера и шаблон итератора.

Контейнер – хэш на базе массива.

Хэш или хэш-таблица – это ассоциативный массив, т.е. контейнер в котором элементы доступны по индексам (ключам), имеющим произвольный тип. Для использования хэш-таблицы, необходимо предоставить функцию, которая должна возвращать положительное целое число (hashcode), по которому определяется позиция элемента в хэш таблице. Для этого предоставляется интерфейсHashable, в котором объявлена чистая виртуальная функцияhashCode(). Ключ хэш-таблицы должен иметь тип, реализующий интерфейсHashable, помимо этого в класса ключа должны быть переопределены операторы сравнения объектовoperator== и присваниванияoperator=.

В качестве элементов массива используются структуры, хранящие пару <ключ – значение> и флаг isNull, говорящий о том, пуст ли данный элемент или нет (в связи с тем, что структура не динамическая и надо знать, какие элементы используются, а какие - нет).

При создании хэш имеет фиксированный заданный размер, но если при добавлении элемента места в хэше не оказалось, то происходит рехеширование – увеличение размера хэша (создает массив в 2 раза большего размера, элементы хэша копируются туда, старый массив удаляется).

При добавлении элемента возвращается пара <итератор элемента, флаг добавления элемента в хэш>, если флаг установлен в false, то добавление не было осуществлено. Если происходит попытка добавить элемент с уже существующим ключем, то объект этот не добавляется.

При удалении возвращается пара <пара<ключ-значение> удаленного элемента и флаг удаления элемента>, если флаг установлен в false, то добавление удаление не было осуществлено. Иначе удаление прошло успешно и первым элементом возвращаемой пары будет пара <ключ-значение> удаленного элемента, таким образом можно освободить ресурсы занимаемые этими объектами.

Поиск позиции объекта с заданным ключем в хэше производится через хэш функцию объекта, вычисляется hashCodeи берется по модулюmaxsize(максимальный “текущий” размер хэша), т.о. определяется индекс в массиве - (object.hashCode()) %maxsize.

Для разрешения коллизий используется метод линейных проб (linearprobing). Идея состоит в том, что сталкиваясь с коллизией при включении записи, мы последовательно (циклически, с переходом через конец на начало) просматриваем массив в поиске первого незанятого элемента.

Если такой элемент обнаруживается, в него и заносится включаемая запись. Если все элементы массива заняты, то это означает, что хэш-таблица переполнена и требуется расширение массива – рехэш. Для этого использунется функция (object.hashCode() + i) %maxsize

Шаблон Хэш (Hash)

Члены-данные

- максимальный размер

int maxSize;

- текущий размер

intsize;

- массив объектов типа HashElem

HashElem<K,V>*t;

Члены-функции

Внутренние:

- вычисление хэш-функции для определения позиции элемента хэша

(вычисляется как object.hashCode()%hashMaxSize)

int h(const K& key);

- функция используется в связке с предыдущей

(вычисляется как (object.hashCode()+1)%hashMaxSize)

int r(const K& key, int i);

- вычисление позиции элемента с ключем Kв хэше

int getPos(const K& key);

- рехэшинг (увеличение размера хэша в 2 раза)

int rehash();

Интерфейсные:

- конструктор (параметр – количество элементов в хэше, значение по умолчанию = 8). Количество элементов увеличивается при необходимости.

Hash(int n = 8);

- деструктор

virtual ~ Hash();

- добавление в хэш (параметр key– ключ, параметрvalue- значение). Возвращает объект типаpair– первый элемент – итератор добавленного элемента или конца хэша, если элемент добавлен не был, второй параметр – булевская переменная, принимающая значениеtrue, если элемент был добавлен в массив.

pair<iterator, bool> put(K key, V value);

- удаление элемента с заданным ключем из хэша (параметр key- ключ). Возвращает пару: первый элемент – пара<ключ-значение> удаленного элемента, второй параметр - булевская переменная, принимающая значениеtrue, если элемент был удален из массива.

pair<pair<K, V>, bool> remove(K key);

- итератор начала хэша

iterator begin()

- итератор конца хэша

iterator end ()

- поиск элемента с заданным ключем в хэше (параметр key- ключ). Возвращает итератор элемента с заданным ключем, если тот был найден, иначе итератор конца хэша.

iterator find(const K& key)

- проверка хэша на пустоту

bool empty()

- получение текущего размера хэша

int getSize()

- получение максимального размера хэша

int getMaxSize()

Шаблон элемента хэша (HashElem)

Члены-данные

- ключ

Kkey;

- значение

Vvalue;

- булевская переменная, принимающая значение true, если элемент хэша “пустой”

bool null;

Члены-функции

Внутренние:

Нет

Интерфейсные:

- дефолтный конструктор. Создает объект и делает его “пустым”

HashElem();

- конструктор (параметры – ключ и значение). Делает объект “непустым”

HashElem(K k, V v):

- конструктор. Создает объект и делает его “непустым”

HashElem(intn= 8);

- деструктор. Разрушает объект и делает его “пустым”

virtual~HashElem();

- селекторы ключа и значения. Возвращают ссылки на объекты

K& getKey()

V& getValue()

- проверка на пустоту

bool isNull()

- установка объекта в состояние “пустой”

voidsetNull()

Шаблон итератора (Hash::iterator)

Члены-данные

- указатель на хэш с которым работает итератор (задается при создании автоматически)

Hash<K,V>*hash;

- текущий индекс в хэше на который указывает итератор

int index;

Члены-функции

Внутренние:

- поиск первого элемента хэша

intfindFirstElemPos()

- поиск следующего элемента хэша после элемента в заданной позиции

int findNextElemPos(int pos)

Интерфейсные:

- конструктор (параметр – указатель на хэш). Индекс устанавливается в позицию первого элемента.

iterator(Hash<K, V>* h)

- конструктор (параметр – указатель на хэш, поз – позиция итератора).

iterator(Hash<K, V>* h, int pos)

- перегруженный оператор *. Возвращает пару <ключ-значение> элемента на который указывает итератор

pair<K,V>operator*()

- перегруженный оператор ++ (префикс). Возвращает пару <ключ-значение> элемента на который указывает итератор

pair<K, V> operator++()

- перегруженный оператор ++ (постфикс). Возвращает пару <ключ-значение> элемента на который указывает итератор, после этого итератор инкрементируется

pair<K, V> operator++(int)

- перегруженный оператор == (для сравнения итераторов)

bool operator==(const iterator& it) const

- перегруженный оператор != (для сравнения итераторов)

bool operator!=(const iterator& it) const

- дружественный перегруженный оператор << (для вывода элемента, на который указывает итератор, в поток)

friend ostream& operator<<(ostream& os, const iterator& it)

Обработка исключений

Класс HashExceptionиспользуется для возбуждения исключения в хэше.

В операторах итератора operator*(), operator++() иoperator++(int) предусмотрена обработка исключений. Если индекс, на который указывает итератор выходит за пределы хэша, то возникает исключение “outofbounds”, это исключение ловится и возвращается последний элемент хэша. При рехэше может возникнуть нехватка памяти, это исключение обрабатывается и элемент не добавляется в массив.