#include #include #include #include #include template void reverse_v1(std::vector &v) { size_t N = v.size(); size_t i = 0, f = N-1; while (i < f) { std::swap(v[i], v[f]); ++i; --f; } } template void mostra(std::vector const &v) { for (auto x: v) { std::cout << x << " "; } std::cout << std::endl; } // Esta e uma especializacao do template mostra para o caso em que o vector // guarda unique_ptr. template void mostra(std::vector> const &v) { for (auto &x: v) { std::cout << *x << " "; } std::cout << std::endl; } struct NaoFunciona { }; std::ostream &operator<<(std::ostream &os, NaoFunciona n) { os << "."; return os; } template class CircularBuffer { std::vector _elements; size_t _first, _n; public: CircularBuffer(size_t n); void push(T v); T front() const; void pop(); size_t size() const; }; template CircularBuffer::CircularBuffer(size_t n) : _elements(n), _first(0), _n(0) { } template T CircularBuffer::front() const { if (_n > 0) { return _elements[_first]; } else { std::cerr << "Tentativa de tirar de onde nao existe\n"; exit(1); } } template void CircularBuffer::push(T v) { _elements[(_first + _n) % _elements.size()] = v; if (_n < _elements.size()) { ++_n; } else { _first = (_first + 1) % _elements.size(); } } template void CircularBuffer::pop() { if (_n > 0) { ++_first; --_n; } } template size_t CircularBuffer::size() const { return _n; } int main(int , char *[]) { std::vector v{1., 2., 3., 4., 5., 6., 7.}; reverse_v1(v); mostra(v); std::vector v2{9, 7, 5, 3, 1}; reverse_v1(v2); mostra(v2); std::vector v3(10); reverse_v1(v3); mostra(v3); std::vector> v4; v4.emplace_back(std::make_unique(2)); v4.emplace_back(std::make_unique(4)); v4.emplace_back(std::make_unique(8)); reverse_v1(v4); mostra(v4); CircularBuffer cb(5); std::cout << "Tamanho atual " << cb.size() << std::endl; for (int i = 1; i < 20; i+=2) { cb.push(i); std::cout << "Tamanho atual " << cb.size() << std::endl; } std::cout << "Conteudo: "; while (cb.size() > 0) { std::cout << cb.front() << " "; cb.pop(); } std::cout << std::endl; return 0; }