#include #include class Solution { template struct arr_iterator { using It = typename C::const_iterator; It it, end; arr_iterator(const C &container) : it(container.begin()), end(container.end()) {} void init() { while (it != end && !predicate(*it)) { ++it; } } auto operator!=(const It &other_it) const -> bool { return it != other_it; } auto operator*() const -> int { return *it; } void operator++() { do { ++it; } while (it != end && !predicate(*it)); } virtual auto predicate(int x) const -> bool = 0; virtual ~arr_iterator() {} }; template struct pos_iterator : arr_iterator { pos_iterator(const C &container) : arr_iterator(container) { arr_iterator::init(); } auto predicate(int x) const -> bool override { return x > 0; } }; template struct neg_iterator : arr_iterator { neg_iterator(const C &container) : arr_iterator(container) { arr_iterator::init(); } auto predicate(int x) const -> bool override { return x < 0; } }; public: std::vector rearrangeArray(const std::vector &nums) { std::vector result; auto positive = pos_iterator(nums); auto negative = neg_iterator(nums); for (bool finished = false; !finished;) { finished = true; if (positive != nums.end()) { result.push_back(*positive); ++positive; finished = false; } if (negative != nums.end()) { result.push_back(*negative); ++negative; finished = false; } } return result; } }; int main() { Solution s; assert((s.rearrangeArray(std::vector{3, 1, -2, -5, 2, -4}) == std::vector{3, -2, 1, -5, 2, -4})); assert((s.rearrangeArray(std::vector{-1, 1}) == std::vector{1, -1})); return 0; }