Проблема в том, что list / vector содержит только значение, а map-s содержит пару ключ-значение.Это не одно и то же, и, чтобы повторить то же самое, что вы должны, по крайней мере, определить, какая часть пары вас интересует.
После того, как вы определились, вам, по сути, нужна операция «разыменования», которая принимает итератор,и -в случае если в качестве значения_типа пара возвращает второй элемент, в противном случае просто разыменовываете его.
// default case, returning itself
template<class T>
T& get_val(T& t) { return t; }
// case for pair (derefence for a map iterator)
template<class K, class V>
V& get_val(std::pair<const K, V>& s) { return s.second; }
// iterator dereference
template<class Iter>
decltype(get_val(*Iter()) deref_iter(const Iter& i)
{ return get_val(*i); }
Конечно, const_iter
версия также требуется, если необходимо.
Теперь:
for(auto i=container.begin(); i!=container-end(); ++i)
do_something_with(deref_iter(i));
будет одинаковым независимо от контейнера.