Глядя на следующий код
template <typename Itr>
constexpr auto foo(Itr first, Itr last)
{
for (; first != std::prev(last); std::advance(first, 1))
{
for (auto j{ first }; j != (std::prev(last) - first); std::advance(j, 1)) // Error here
{
// Do stuff
}
}
}
Во втором для l oop я получаю ошибку:
no operator found which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)
Мне не разрешено сравнивать итератор с ptrdiff_t apperently. Итак, как я могу выполнить эту задачу? Я пытался использовать все доступные броски, как для j, так и для ptrdiff_t, но ничего не разрешено.
Причина, по которой мне это нужно, заключается в том, что я хочу, чтобы внутренний l oop перебирал только меньшее подмножество контейнер для каждой итерации внешнего l oop.
Примером, где мне это нужно, является реализация алгоритма сортировки пузырьков
template <typename Itr>
constexpr auto bubble_sort(Itr first, Itr last)
{
for (; first != std::prev(last); std::advance(first, 1))
{
auto swapped{ false };
for (auto j{ first }; j != (std::prev(last) - first); std::advance(j, 1))
{
if (*j > *std::next(j)) // Pred
{
std::iter_swap(j, std::next(j));
swapped = true;
}
}
if (!swapped) break;
}
}