Похоже, вы забыли логическое значение. Мой c ++ довольно ржавый, так что будьте осторожны. Вместо этого:
for (unsigned int i = 0; i < v.size(); i++)
{
for (auto itj = v.begin(); itj != v.end() - 1; itj = std::next(itj))
{
if ((*itj).getSize().y > (*std::next(itj)).getSize().y)
{
std::swap(*itj, *std::next(itj));
}
}
}
У вас должно получиться что-то вроде этих строк:
bool swapped = false;
do {
swapped = false;
for (unsigned int i = 0; i < v.size(); i++)
{
for (auto itj = v.begin(); itj != v.end() - 1; itj = std::next(itj))
{
if ((*itj).getSize().y > (*std::next(itj)).getSize().y)
{
std::swap(*itj, *std::next(itj));
swapped = true;
}
}
}
} while (swapped);
Идея заключается в том, что вы завершаете сортировку только тогда, когда вам нечего сортировать. В исходном коде вы сравните каждый прямоугольник с его соседом, а затем остановитесь. Этого недостаточно: вы должны удерживать это, пока каждый прямоугольник не приблизится к отсортированному прямоугольнику. Вот как вы узнаете, что все готово.
(Надеюсь, я не слишком сильно вырезал синтаксис. Думайте об этом как о псевдокоде, если так лучше.)
Удачи!