#pragma once template typename std::vector::iterator unordered_erase (std::vector &vec, typename std::vector::iterator iter) { size_t pos = iter - vec.begin (); vec.at (pos) = vec.back (); vec.pop_back (); return vec.begin () + pos; } template typename std::vector::iterator unordered_erase (std::vector &vec, typename std::vector::size_type pos) { return unordered_erase (vec, vec.begin () + pos); } template typename std::vector::iterator unordered_erase (std::vector &vec, typename std::vector::const_reference element) { return unordered_erase (vec, &element - &vec.front ()); }