#pragma once #include #include namespace PyUtils { template std::vector slice(std::vector const &v, uint32_t m, uint32_t n = -1) { auto first = v.cbegin() + m; auto last = n == -1 ? v.cend() : v.cbegin() + n; std::vector vec(first, last); return vec; } std::vector range(uint32_t start, uint32_t end); template T max(std::vector const &v) { T max = v[0]; for (auto const &value: v) { if (value > max) { max = value; } } return max; } template T min(std::vector const &v) { T min = v[0]; for (auto const &value: v) { if (value < min) { min = value; } } return min; } template std::vector keys(std::unordered_map const &map) { std::vector result; for (auto const &pair: map) { result.push_back(pair.first); } return result; } template std::vector keys(std::map const &map) { std::vector result; for (auto const &pair: map) { result.push_back(pair.first); } return result; } } template std::vector operator+(std::vector const &x, std::vector const &y) { std::vector vec; vec.reserve(x.size() + y.size()); vec.insert(vec.end(), x.begin(), x.end()); vec.insert(vec.end(), y.begin(), y.end()); return vec; }