Вы можете сделать математику итератора в общем, как это:
std::list<int>::iterator it = l.begin();
std::advance(it, std::distance(l.begin(), l.end())/2);
l.insert(it, value);
Это будет работать для любого типа итератора (кроме OutputIterator или InputIterator)
Конечно, гораздо эффективнее сказать
std::advance(it, l.size()/2);
l.insert(it, value);
К сожалению, l.insert(l.begin + (l.size()/2), value)
не будет работать, потому что итераторы списков не являются произвольным доступом, поэтому не определено operator+
(чтобы избежать неожиданностей в производительности!). Помните, что std::advance()
может быть дорогостоящей операцией в зависимости от типа итератора (она будет медленной для обратных итераторов , реализованных в контейнере только для пересылки, например).