Sorting 对矩形向量排序

Sorting 对矩形向量排序,sorting,vector,c++14,sfml,Sorting,Vector,C++14,Sfml,所以我尝试使用SFML实现冒泡排序算法。我已经创建了一个向量,在其中我附加了一些矩形,我将根据它们的高度对它们进行排序,但它似乎什么都没有排序。我做错什么了吗?请测试此代码。。。不算太多 #include <SFML/Graphics.hpp> #include <ctime> #include <iostream> #include <vector> int main() { srand(time(0)); float rand

所以我尝试使用SFML实现冒泡排序算法。我已经创建了一个向量,在其中我附加了一些矩形,我将根据它们的高度对它们进行排序,但它似乎什么都没有排序。我做错什么了吗?请测试此代码。。。不算太多

#include <SFML/Graphics.hpp>
#include <ctime>
#include <iostream>
#include <vector>

int main()
{
    srand(time(0));
    float randomHeight;
    std::vector<sf::RectangleShape> v;
    float currY = 100;
    sf::RenderWindow window(sf::VideoMode(1280, 800), "SFML works!");
    
    for (unsigned int i = 0; i < 100; i++)
    {
       
        randomHeight = rand() % 500 + 200;
        sf::RectangleShape rect({ 4, randomHeight });
        rect.setFillColor(sf::Color::White);
        rect.setRotation(180);
        currY += 10;
        rect.setPosition({ currY, 720 });

        v.push_back(rect);
    }
  

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        
        
        
        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)); 
                }
            }
        }

        for (auto i = v.begin(); i != v.end(); i = std::next(i))
            window.draw(*i);
        window.display();
       
        
    }
    
    return 0;
}
#包括
#包括
#包括
#包括
int main()
{
srand(时间(0));
浮动高度;
std::向量v;
浮动咖喱=100;
sf::RenderWindow窗口(sf::VideoMode(1280800),“SFML工作!”;
for(无符号整数i=0;i<100;i++)
{
randomHeight=rand()%500+200;
sf::RectangleShape rect({4,randomHeight});
rect.setFillColor(sf::Color::White);
直线旋转(180);
咖喱+=10;
rect.setPosition({currY,720});
v、 推回(rect);
}
while(window.isOpen())
{
sf::事件;
while(window.pollEvent(事件))
{
如果(event.type==sf::event::Closed)
window.close();
}
for(无符号整数i=0;i(*std::next(itj)).getSize().y)
{
标准::交换(*itj,*std::下一步(itj));
}
}
}
对于(自动i=v.begin();i!=v.end();i=std::next(i))
窗图(*i);
window.display();
}
返回0;
}

交换元素不会改变绘制矩形的(x,y)坐标。为了解决这个问题,你需要像这样交换两个矩形的坐标

std::swap(*itj, *std::next(itj)); 

//Swapping x,y coordinates
int x = (*itj).getPosition().x;
int y = (*itj).getPosition().y;

int x_next = (*std::next(itj)).getPosition().x;
int y_next = (*std::next(itj)).getPosition().y;

(*itj).setPosition( sf::Vector2f(x_next, y_next) );
(*std::next(itj)).setPosition( sf::Vector2f(x, y) );

这将根据矩形的高度按递增顺序对其进行排序。

交换元素不会更改绘制矩形的(x,y)坐标。为了解决这个问题,你需要像这样交换两个矩形的坐标

std::swap(*itj, *std::next(itj)); 

//Swapping x,y coordinates
int x = (*itj).getPosition().x;
int y = (*itj).getPosition().y;

int x_next = (*std::next(itj)).getPosition().x;
int y_next = (*std::next(itj)).getPosition().y;

(*itj).setPosition( sf::Vector2f(x_next, y_next) );
(*std::next(itj)).setPosition( sf::Vector2f(x, y) );

这将根据矩形的高度按递增顺序对其排序。

似乎您忘记了布尔值。我的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)); 
        }
    }
}
for(无符号整数i=0;i(*std::next(itj)).getSize().y)
{
标准::交换(*itj,*std::下一步(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);
bool swapped=false;
做{
交换=假;
for(无符号整数i=0;i(*std::next(itj)).getSize().y)
{
标准::交换(*itj,*std::下一步(itj));
交换=真;
}
}
}
}while(交换);
这里的想法是,只有在没有任何东西可供排序时,才结束排序。在原始代码中,将每个矩形与其相邻矩形进行比较,然后停止。这还不够:你必须一直保持到每个矩形都接近一个排序的矩形。这就是为什么你知道你已经完成了

(我希望我没有过多地破坏语法。如果这样更好的话,可以将其视为伪代码。)


玩得开心

你好像忘了布尔值。我的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)); 
        }
    }
}
for(无符号整数i=0;i(*std::next(itj)).getSize().y)
{
标准::交换(*itj,*std::下一步(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);
bool swapped=false;
做{
交换=假;
for(无符号整数i=0;i(*std::next(itj)).getSize().y)
{
标准::交换(*itj,*std::下一步(itj));
交换=真;
}
}
}
}while(交换);
这里的想法是,只有在没有任何东西可供排序时,才结束排序。在原始代码中,将每个矩形与其相邻矩形进行比较,然后停止。这还不够:你必须一直保持到每个矩形都接近一个排序的矩形。这就是为什么你知道你已经完成了

(我希望我没有过多地破坏语法。如果这样更好的话,可以将其视为伪代码。)


玩得开心

我不确定那是OP想要的。看起来OP只是想改变绘图顺序。我不确定OP想要的是什么。看起来OP只是想更改绘图顺序。