Задания по С++ — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
Строка 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 ==
=== merge sort ===
+
 
Необходимо написать функцию сортировки слиянием.<br />
 
Необходимо написать функцию сортировки слиянием.<br />
 
Сигнатура функции должны быть такой:<br />
 
Сигнатура функции должны быть такой:<br />
Строка 59: Строка 58:
 
для получения типа, на который указывает указатель, можно воспользоваться <code>std::iterator_traits</code>
 
для получения типа, на который указывает указатель, можно воспользоваться <code>std::iterator_traits</code>
  
== Лабораторная работа №4 ==
+
== Лабораторная работа №4 iterator ==
=== iterator ===
+
 
Написать наблонный класс <code>slist</code> односвязный список.<br />
 
Написать наблонный класс <code>slist</code> односвязный список.<br />
 
Реализовать для него <code>forward</code> итератор.
 
Реализовать для него <code>forward</code> итератор.
  
  
== Лабораторная работа №5 ==
+
== Лабораторная работа №5 functor ==
=== functor ===
+
 
Реализовать алгоритм  
 
Реализовать алгоритм  
 
<source lang="cpp">
 
<source lang="cpp">
Строка 78: Строка 75:
  
  
== Лабораторная работа №6 ==
+
== Лабораторная работа №6 mem_fun ==
=== mem_fun ===
+
 
Реализовать аналог <code>std::mem_fun</code>, убедиться, что аналог работает на коде:
 
Реализовать аналог <code>std::mem_fun</code>, убедиться, что аналог работает на коде:
 
<source lang="cpp">
 
<source lang="cpp">
Строка 89: Строка 85:
  
  
== Лабораторная работа №7 ==
+
== Лабораторная работа №7 заполнитель мапы ==
=== mem_fun ===
+
 
Реализовать заполнитель мапы
 
Реализовать заполнитель мапы
 
<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));