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

template<class FwdIt>
FwdIt remove_nth(FwdIt p, FwdIt q, size_t const n)
{
	for (size_t i = 0; i < n && p != q; ++i, ++p) { }
	if (p == q) {
		return q;
	}
	
	auto lastValidIterator = p++;
	for (; p != q; ++p) {
		std::iter_swap(lastValidIterator, p);
		lastValidIterator = p;
	}

	return lastValidIterator;
}

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"));

	return 0;
}