diff --git a/exercises/README.md b/exercises/README.md index 93ca7ea..4f86e29 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -152,3 +152,75 @@ Critically think about ownership and minimize the amount of heap allocations. Take a look at [Boost's chat server example](https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/examples/cpp11_examples.html#boost_asio.examples.cpp11_examples.chat). Try to understand how the session's lifetime is managed by the server. Focus on `std::enable_shared_from_this` in combination with lambda captures. + +## Task 12 + +Reuse `Person` from Task 08 and take the following, incomplete definition of a room: + +```cpp +class Room { + public: + Room(int id, size_t limit) : id(id), limit(limit) {} + + // Returns true iff the person successfully entered. + bool enter(/* Person */) {} + + void exit(/* Person */) {} + + private: + const int id; + const size_t limit; + std::vector peopleInside; +}; +``` + +`Room` contains a list of people currently located inside. +People can enter and exit the room via the respective member functions. +However, at most only `limit` people may be inside at any given time (invariant). + +- Add the missing pieces, paying special attention to the types + +The following use cases need to be covered next: +- Asking a `Room` how many people are currently located inside +- Asking a `Room` whether a specific person is currently located inside +- Iterating over all people currently located in a `Room` + +Implement whatever is necessary to support these use cases, making sure the invariant remains intact. + +## Task 13 + +Reuse `Person` from Task 08. + +Create an `std::vector>` with at least 3 different elements. +Create a function which takes a `const std::vector>&` as input and returns an `std::vector`. +Each element in the result vector corresponds to the respective element in the input vector. + +For the functional programming nerds, the definition of this function would be something like `fmap std::shared_ptr::get`. + +Write your function in different ways and compare the readability: +- use a range-based for loop +- use `std::transform` +- use a lambda expression +- use `std::mem_fn` + +Think about taking the argument by value instead of taking it by const reference. + +## Task 14 + +Implement your own version of `std::vector` without using any of the provided containers — use *regular arrays* (`new[]` / `delete[]`) to house your elements. +The focus of this task lies on the use of templates and implementation of iterators. +You do not have to concern yourself with custom allocators. + +Test your implementation with different types (`int`, `double`, and a custom struct). + +Take your vector from task 1 and implement iterators. +You might want to read through the respective documentation. + +Write some tests utilising algorithms provided by the standard library to check if your iterators behave correctly. + +## Task 15 + +Take your vector implementation from Task 14 and instantiate it with a big number of unique types. + +Inspect the relationship between the number of unique instantiates and compile time. +Furthermore, look at the compiled object file using `nm`.