Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.03 Mб
Скачать

6.11.5 Разработка класса − контейнера

Разработать класс − контейнер MyVector, аналогичный std::vector из стандартной библиотеки C++.

1. Контейнер не должен засорять память (вся выделенная память должна освобождаться).

2. Показать возможность хранения в контейнере объектов пользовательских типов.

3. Показать возможность хранения в качестве элементов контейнера самого контейнера. Например, класс Matrix на основе класса MyVector (MyVector<MyVector<int>> matrix).

4. Добавить возможность задания начального значения вектора с помощью списка инициализации.

5. Добавить возможность вставки нескольких значений с помощью списка инициализации.

6. Добавить возможность обхода элементов вектора с помощью цикла for для коллекций. Для этого необходимо предусмотреть функции begin() и end(), возвращающие итераторы.

6.11.6 Оценка производительности кода

Проанализировать производительность кода контейнера из предыдущего задания. Определить методы, выполнение которых занимает больше всего времени. Для анализа производительности можно воспользоваться приведенным ниже классом.

class BlockProfile

{

static std::map<const char*, float> mBlockTimeMap;

LARGE_INTEGER frequency, start, finish;

const char* mBlockName;

public:

BlockProfile(const char* blockName)

{

// Замер времени при входе в блок

mBlockName = blockName;

QueryPerformanceFrequency(&frequency);

QueryPerformanceCounter(&start);

}

~BlockProfile()

{

// Замер времени при выходе из блока и определение

// времени жизни объекта

QueryPerformanceCounter(&finish);

float delay = (float)(finish.QuadPart - start.QuadPart) /

frequency.QuadPart;

mBlockTimeMap[mBlockName] += delay;

}

// Печать итоговых результатов оценки производительности

static void printProfile()

{

float maxTime = 0;

for(std::map<const char*, float>::iterator it =

mBlockTimeMap.begin();

it != mBlockTimeMap.end();

++it)

{

maxTime = maxTime > it->second ? maxTime : it->second;

}

for(std::map<const char*, float>::iterator it =

mBlockTimeMap.begin();

it != mBlockTimeMap.end();

++it)

{

std::cout << it->first << ": "

<< it->second << " "

<< (int)(100.0 * (it->second / maxTime))

<< "%" << std::endl;

}

}

};

std::map<const char*, float> BlockProfile::mBlockTimeMap;

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

Объект класса BlockProfile получает в качестве параметра конструктора строку, описывающую данный блок. При многократном входе в блок задержка суммируется.

void fun1()

{

BlockProfile fun1("fun1");

for(int i = 0; i != 1000000; ++i)

{

double f = sqrt((double)i);

double f2 = f * f;

}

}

Перед завершением программы можно распечатать результат работы, вызвав метод BlockProfile::printProfile();

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]