Let's start with a simple example:
std::vector<int> foo;
... // fill it
auto begin = foo.begin();
auto end = foo.end();
auto middle = begin + std::distance(begin, end) / 2;
If the iterators have the LegacyRandomAccessIterator trait, ideal bi-partition of the iterator range is embarrassingly easy, and so is therefor any form of divide-and-conquer type algorithm. This pattern is commonly found in the STL implementations too.
If they provide only the LegacyForwardIterator trait, only thing we can do in constant time is:
std::set<int> foo;
... // fill it
auto begin = foo.begin();
auto end = foo.end();
auto middle = (begin != end) ? ++(begin) : begin;
No chance of processing the iterator range in an even remotely balanced way without a linear scan.
It's easy to understand that for most containers not providing LegacyRandomAccessIterator, an ideal partition scheme can't be for free. However, most containers would still be able to provide a partitioning scheme better than 1:n-1 on average at a constant cost.
Any container based on a self balancing tree would be trivially able to guarantee a worst-case ratio based on intrinsic implementation details. Any hash table - be it bucket or multiple round based - still has a high chance of providing a good partition, just by slicing the hash table itself in half.
Only imbalanced trees or plain lists are by design unsuitable.
This deficit also shows in STL internal algorithms depending on a somewhat balanced division, e.g. like std::for_each(std::execution::par_unseq, ...). Even though most STL containers in about all implementations have implementation details which allow constant time partition into remotely balanced chunks, I have yet to see any STL implementation handling anything except LegacyRandomAccessIterator better than pure single element round-robin. Commonly resulting in false-sharing of cache lines, and synchronization overhead far beyond any practical value.
This begs the question, how come that the C++ language provides no interface to request a better partition scheme for any STL containers? Or is there one I am just not aware of?