You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SFML冒泡排序可视化器:矩形/条形无法交换的问题排查

问题分析与解决方案

你的代码无法实现矩形交换的核心原因有以下几点:

  • 变量名作用域冲突:主循环中定义的i和绘制循环中定义的int i同名,虽语法合法,但会导致代码可读性差,还容易引发逻辑混淆(比如后续修改颜色时的变量指向歧义)。
  • 缺少std::swap依赖的头文件:当你尝试用std::swap交换数组元素时,代码未包含<algorithm>或<utility>头文件,编译器会报错,导致交换逻辑无法正常执行。
  • 未排除无效交换场景:随机生成的i和j可能相等,此时交换操作相当于无意义的重复赋值,会让你误以为交换功能失效。
  • 手动交换逻辑冗余:手动交换位置和尺寸的逻辑本身是正确的,但不如直接交换整个矩形对象简洁可靠,且容易因疏忽遗漏属性(比如后续添加的其他矩形属性)。

修复后的代码

#include<iostream>
#include<SFML/Graphics.hpp>
#include<cstdlib>
#include<ctime>
#include<chrono>
#include<thread>
#include<algorithm> // 添加std::swap所需的头文件

int main()
{
    srand(time(NULL));
    sf::RenderWindow window(sf::VideoMode(798, 400), "Yoo", sf::Style::Default);
    sf::RectangleShape *rec=new sf::RectangleShape[133];
    
    for (int i = 0; i < 133; i++)
    {
        int num = rand() % 400;
        rec[i].setFillColor(sf::Color::Red);
        rec[i].setSize(sf::Vector2f(4.0f, static_cast<float>(num)));
        rec[i].setPosition(sf::Vector2f(static_cast<float>(i * 6), 400 - num));
    }
    
    sf::Event ev;
    while (window.isOpen())
    {
        int idx1 = rand() % 133;
        int idx2 = rand() % 133;
        
        // 排除无效交换场景
        while (idx1 == idx2)
        {
            idx2 = rand() % 133;
        }
        
        while (window.pollEvent(ev))
        {
            if (ev.type == sf::Event::Closed)
            {
                window.close();
            }
        }
        
        window.clear(sf::Color::White);
        
        // 标记要交换的矩形
        rec[idx1].setFillColor(sf::Color::Blue);
        rec[idx2].setFillColor(sf::Color::Green);
        
        // 使用std::swap直接交换整个矩形对象,简洁可靠
        std::swap(rec[idx1], rec[idx2]);
        
        // 绘制所有矩形
        for (int i = 0; i < 133; i++)
        {
            window.draw(rec[i]);
        }
        
        // 恢复颜色
        rec[idx1].setFillColor(sf::Color::Red);
        rec[idx2].setFillColor(sf::Color::Red);
        
        window.display();
        std::this_thread::sleep_for(std::chrono::milliseconds(2000));
    }
    
    delete[] rec;
    return 0;
}

关键修改说明

  1. 重命名变量避免冲突:将主循环中的随机索引变量改为idx1和idx2,彻底避免与绘制循环的i变量混淆。
  2. 添加必要头文件:引入<algorithm>以支持std::swap函数。
  3. 排除无效交换:通过循环确保idx1和idx2不相等,避免无意义的交换操作。
  4. 使用std::swap交换对象:直接交换整个sf::RectangleShape对象,自动处理位置、尺寸、颜色等所有属性,避免手动交换时的遗漏或错误。

内容的提问来源于stack exchange,提问作者Jitu Biswas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:45:32