#include #include #include #include template class Ping_Pong { public: template Ping_Pong(Container const& data) : data { data.begin(), data.end() } { } T const& operator[](int index) const { int size { static_cast(data.size()) }; index = index % (2 * size); if (index < 0) { index += 2 * size; index = index % (2 * size); } if (index < size) return data[index]; index = size - (index - size) - 1; return data[index]; } void append(T const& element) { data.push_back(element); } private: std::vector data { }; }; int main() { { std::vector v { 0, 1, 2, 3 } ; Ping_Pong p { v }; for (int i { -10 }; i <= 10; ++i) std::cout << p[i] << " "; std::cout << std::endl; p.append(4); for (int i { -10 }; i <= 10; ++i) std::cout << p[i] << " "; std::cout << std::endl; } { std::list v { "PONTUS", "ERIC", "MALTE", "NILS", "EDVIN" }; Ping_Pong p { v }; for (int i { -4 }; i <= 5; ++i) std::cout << p[i] << " "; std::cout << std::endl; p.append("CHRISTOFFER"); for (int i { -4 }; i <= 5; ++i) std::cout << p[i] << " "; std::cout << std::endl; } { std::vector v { 0, 1 }; std::set s { 0, 1 }; Ping_Pong p { v }; // se till att behållaren inte är en mallparameter till Ping_Pong. p = Ping_Pong{ s }; for (int i { -9 }; i <= 10; ++i) std::cout << p[i] << " "; std::cout << std::endl; } }