Самое ясное решение, на мой взгляд, это потянуть std::stable_partition
до for
. Это приведет к эквивалентному алгоритму.
Проблема в том, что stable_partition
возвращает итератор, который может изменять элементы. К счастью, существует неявное преобразование из container::iterator
в container::const_iterator
(для большинства стандартных контейнеров). Чтобы выполнить преобразование, вы можете указать тип IterEnd
с std::vector<T::const_iterator
или decltyp(Target.cbegin()
или мои личные предпочтения:
auto Iter = Target.cbegin();
decltype(Iter) IterEnd = std::stable_partition(Target.begin(), Target.end(), Check);
for (; Iter != IterEnd; ++Iter)
{
}
Для полноты вы можете оставить все внутри for
, если хотите, но, на мой взгляд, он менее читабелен:
for (auto Iter = Target.cbegin(),
IterEnd = (decltype(Iter)) std::stable_partition(Target.begin(), Target.end(), Check);
Iter != IterEnd;
++Iter)
{}