I only provide this answer because the OP wants to do this using a range for loops. It is not more elegant than regular loops.
If your vector does not have duplicate numbers, you can use reverse iteration instead of starting at a certain point in the second loop so that you can use a range based on your iterations.
to reverse iterate over a range based on loops that require an adapter class.
template <typename It> class reverse_adapter { public: reverse_adapter(It rbegin, It rend) : _rbegin(rbegin), _rend(rend) {} It begin() const { return _rbegin; } It end() const { return _rend; } private: It _rbegin; It _rend; }; template<typename Container> reverse_adapter<typename Container::reverse_iterator> make_reverse(Container& container) { reverse_adapter<typename Container::reverse_iterator> adapter(std::rbegin(container), std::rend(container)); return adapter; }
And use this adapter to reverse iterate in the second loop.
for(auto val : vec) { for (auto second_val : make_reverse(vec)) // Start from last to current item in first loop { if (val == second_val) break; // Instead of first + 1 in second loop auto dif = val - second_val; } }
source share