块C++SFML的排序向量



我只是想制作一个小程序,使用选择排序对块进行排序,但它本身并不排序。块只是以某种模式不断切换位置,直到我终止这个过程。

我认为摇摆积木有问题,但说实话,我真的很失落。

我会感谢你们的任何帮助。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace sf;
int main()
{
RenderWindow win(VideoMode(200, 200), "SFML works!",Style::Titlebar);
win.setFramerateLimit(60);
std::vector<RectangleShape> blocks;
for(int i=1;i<=10;i++)
{
RectangleShape block(sf::Vector2f(20,20*i));
block.setOrigin(block.getSize().x,block.getSize().y);
block.setOutlineColor(Color::Red);
block.setOutlineThickness(0.5f);
//block.setPosition(i*20,200);
blocks.push_back(block);
}
std::random_shuffle(blocks.begin(),blocks.end());
for(int i=1;i<=10;i++)
blocks[i].setPosition(i*20,200);
bool t = false;
while (win.isOpen())
{
Event event;
while (win.pollEvent(event))
{
if (event.type == Event::Closed)
win.close();
if(event.type == Event::KeyPressed)
if (Keyboard::isKeyPressed(Keyboard::Space)){
if(t){
t = false;
std::cout<<"KLIK"<<"n";
break;
}
t = true;
std::cout<<"KLIK"<<"n";
}
}
win.clear();
for(auto a:blocks)
win.draw(a);
if(t){
int k;
for(int i=0;i<blocks.size();i++)
{
win.clear();
for(auto a:blocks)
win.draw(a);
win.display();
k = i;
for(int j=i+1;j<blocks.size();j++)
if(blocks[j].getSize().y < blocks[k].getSize().y)
k = j;
Vector2f temp = blocks[k].getPosition();
blocks[k].setPosition(blocks[i].getPosition().x,blocks[i].getPosition().y);
blocks[i].setPosition(temp.x,temp.y);
//std::cout<<i<<"n";
}
}
win.display();
}
return 0;
}

首先,这里有一个异常out_of_range

for(int i=1;i<=10;i++)
blocks[i].setPosition(i*20,200);

请记住,在c++中,索引从0开始,当您在向量中使用push_back()10次时,索引为0到9

解决方案:

for(int i=0;i<10;i++)
blocks[i].setPosition((i+1)*20,200);

其次,在选择排序中,您仍然需要替换向量中的索引,以便排序后的值位于前面。

解决方案:

Vector2f temp = blocks[k].getPosition();
blocks[k].setPosition(blocks[i].getPosition().x,blocks[i].getPosition().y);
blocks[i].setPosition(temp.x,temp.y);
std::swap(blocks[k], blocks[i]);

最新更新