template<class T>
bool my_next_permutation(T first, T last) {
if (first == last) return false;
if (first + 1 == last) return false;
T i = last - 1;
while (true)
{
T ii = i;
i--;
if (*i < *ii) {
T j = last;
while (!(*i<*--j));
iter_swap(i,j);
reverse(ii, last);
return true;
}
if (i == first) {
reverse(first, last);
return false;
}
}
}