对矩形向量进行排序
Sorting a vector of rectangles
所以我正在尝试使用 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;
}
交换元素不会改变绘制矩形的 (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));
}
}
}
你应该有这些东西:
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);
这里的想法是,只有在没有任何东西要排序时才结束排序。在您的原始代码中,您会将每个矩形与其邻居进行比较,然后停止。这还不够:您必须坚持下去,直到每个矩形都接近已排序的矩形。这就是您知道自己完成的方式。
(我希望我没有过多地破坏语法。如果这样更好的话,可以将其视为伪代码。)
玩得开心!
所以我正在尝试使用 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;
}
交换元素不会改变绘制矩形的 (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));
}
}
}
你应该有这些东西:
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);
这里的想法是,只有在没有任何东西要排序时才结束排序。在您的原始代码中,您会将每个矩形与其邻居进行比较,然后停止。这还不够:您必须坚持下去,直到每个矩形都接近已排序的矩形。这就是您知道自己完成的方式。
(我希望我没有过多地破坏语法。如果这样更好的话,可以将其视为伪代码。)
玩得开心!