#include <iostream>
#include <iterator>
#include <list>

template<class FwdIt>
FwdIt remove_nth(FwdIt p, FwdIt q, size_t n)
{
	if (std::distance(p, q) == 0) return p;
	if (std::distance(p, q) < n)  return q;

	for (size_t i = 0; i < n; ++p, ++i);
	for (++p; p != q; ++p)
	{
		std::iter_swap(p, std::prev(p));
	}

	return std::prev(p);
}

int main()
{
	std::list<int> ls = { 1, 2, 3, 4, 5 };
	ls.erase(remove_nth(ls.begin(), ls.end(), 2));
	std::copy(ls.begin(), ls.end(), std::ostream_iterator<int>(std::cout, "\n"));

	std::list<int> xs = {};
	ls.erase(remove_nth(ls.begin(), ls.end(), 2));

	return 0;
}