Задания по С++ — различия между версиями
Btv (обсуждение | вклад) |
Btv (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | == Лабораторная работа №1 | + | == Лабораторная работа №1 Шаблоны == |
− | + | ||
Реализовать собственный контейнер | Реализовать собственный контейнер | ||
<source lang="cpp">template<typename T> | <source lang="cpp">template<typename T> | ||
Строка 25: | Строка 24: | ||
</source> | </source> | ||
− | == Лабораторная работа №2 | + | == Лабораторная работа №2 Синглтон == |
− | + | ||
Написать протой логгер | Написать протой логгер | ||
Строка 43: | Строка 41: | ||
</source> | </source> | ||
+ | Представить, что понадобилось ещё несколько синглтонов, вынести общий для всех синглтонов код в отдельный класс <code>Singleton</code>. | ||
+ | Реализовать логгер с использованием класса <code>Singleton</code> так, чтоб код, использующий логгер, не надо было модифицировать. | ||
− | == Лабораторная работа №3 | + | == Лабораторная работа №3 merge sort == |
− | + | ||
Необходимо написать функцию сортировки слиянием.<br /> | Необходимо написать функцию сортировки слиянием.<br /> | ||
Сигнатура функции должны быть такой:<br /> | Сигнатура функции должны быть такой:<br /> | ||
Строка 59: | Строка 58: | ||
для получения типа, на который указывает указатель, можно воспользоваться <code>std::iterator_traits</code> | для получения типа, на который указывает указатель, можно воспользоваться <code>std::iterator_traits</code> | ||
− | == Лабораторная работа №4 | + | == Лабораторная работа №4 iterator == |
− | + | ||
Написать наблонный класс <code>slist</code> односвязный список.<br /> | Написать наблонный класс <code>slist</code> односвязный список.<br /> | ||
Реализовать для него <code>forward</code> итератор. | Реализовать для него <code>forward</code> итератор. | ||
− | == Лабораторная работа №5 | + | == Лабораторная работа №5 functor == |
− | + | ||
Реализовать алгоритм | Реализовать алгоритм | ||
<source lang="cpp"> | <source lang="cpp"> | ||
Строка 78: | Строка 75: | ||
− | == Лабораторная работа №6 | + | == Лабораторная работа №6 mem_fun == |
− | + | ||
Реализовать аналог <code>std::mem_fun</code>, убедиться, что аналог работает на коде: | Реализовать аналог <code>std::mem_fun</code>, убедиться, что аналог работает на коде: | ||
<source lang="cpp"> | <source lang="cpp"> | ||
Строка 89: | Строка 85: | ||
− | == Лабораторная работа №7 | + | == Лабораторная работа №7 заполнитель мапы == |
− | + | ||
Реализовать заполнитель мапы | Реализовать заполнитель мапы | ||
<source lang="cpp"> | <source lang="cpp"> | ||
std::map<float, int> m(mapper(1.0, 2)(2, 2)(4, 2)); | std::map<float, int> m(mapper(1.0, 2)(2, 2)(4, 2)); | ||
</source> | </source> |
Версия 09:56, 30 марта 2011
Содержание
Лабораторная работа №1 Шаблоны
Реализовать собственный контейнер
template<typename T>
class Container {
public:
void push_back(const T& t);
T& back();
size_t size() const;
};
В качестве хранилища значенией в реализации Container
используйте std::vector
.
Затем создайте новый контейнер с двумя шаблонными параметрами, первый - тип хранимых значений, второй - тип хранилища, используемый в реализации вашего контейнера.
Пример использования такого контейнера
Container<int, std::list<int> > c;
Затем создайте новый контейнер с двумя шаблонными параметрами, первый - тип хранимых значений, второй - шаблон, используемый в реализации вашего контейнера.
Пример использования такого контейнера
Container<int, std::deque> c;
Лабораторная работа №2 Синглтон
Написать протой логгер
class Logger {
public:
void warn(const std::string& msg);
static Logger& getInstance();
};
Запретить пользователю его создание, копирование.
Пример использования
Logger& log = Logger::getInstance();
log.warn("Ooops");
Представить, что понадобилось ещё несколько синглтонов, вынести общий для всех синглтонов код в отдельный класс Singleton
.
Реализовать логгер с использованием класса Singleton
так, чтоб код, использующий логгер, не надо было модифицировать.
Лабораторная работа №3 merge sort
Необходимо написать функцию сортировки слиянием.
Сигнатура функции должны быть такой:
template<typename Iter>
std::list<typename Iter::value_type> mergeSort(Iter left, Iter right);
Исходные данные функция модифицировать не должна, в возвращаемом списке должны быть отсортированные элементы.
Затем необходимо добиться, чтоб можно было сортировать по указателям:
int* array = new int[SIZE];
mergeSort(array, array + SIZE);
Рекомендации: для merge можно воспользоваться std::list::merge
для получения типа, на который указывает указатель, можно воспользоваться std::iterator_traits
Лабораторная работа №4 iterator
Написать наблонный класс slist
односвязный список.
Реализовать для него forward
итератор.
Лабораторная работа №5 functor
Реализовать алгоритм
template<typename InIter, typename OutIter, typename Pred>
OutIter filter(InIter begin, InIter end, OutIter out, Pred pred);
который читает елементы и, если pred(val)
возвращает true
, то записывает елемент в out
.
Реализовать собственный функтор, который принимает std::set<char>
и char
и проверят наличие входного символа в сете.
С помощью алгоритма filter
и вашего функтора отфильровать строку.
Лабораторная работа №6 mem_fun
Реализовать аналог std::mem_fun
, убедиться, что аналог работает на коде:
std::vector<char> v;
std::set<int> s;
mem_fun(&std::vector<char>::push_back)(v, 'd');
mem_fun(&std::set<int>::count)(s, 3);
Лабораторная работа №7 заполнитель мапы
Реализовать заполнитель мапы
std::map<float, int> m(mapper(1.0, 2)(2, 2)(4, 2));