【问题标题】:selectionSort with std::function as parameter in c++以std :: function作为c ++中的参数的selectionSort
【发布时间】:2021-01-13 19:20:46
【问题描述】:
class MySort
{
void bubble(std::vector<int> &vec, std::function<int(int,int)> func)
         { ... } //tihs works

void selectionSort(std::vector<int> &vec, std::function<int(int,int)> func)
         {
             int vecSize=vec.size();
             int i, j, min_idx;
             int temp;
             for (i = 0; i < vecSize-1; i++)  
             {  
                 min_idx = i;  
                 for (j = i+1; j < vecSize; j++)  
                 if(func(vec[j],vec[min_idx]) < 0)
                 min_idx = j;

                 temp = vec[min_idx];
                 vec[min_idx] = vec[i];
                 vec[i] = temp;  
             }
         }
};

我还有另一个 MyData 类:

class MyData
{
     std::vector<int> t_;
    
     int sortNormal2(int first, int sec)
    {
        return first > sec;
    }

public :
       MyData(std::vector<int> t)
        {
            std::copy(t.begin(),t.end(),back_inserter(t_));
        }

        void sortNormal(std::string choice)
        {
            MySort s;
            auto sort= std::bind(&MyData::sortNormal2,this,std::placeholders::_1, std::placeholders::_2);
            if(choice == "bubbleSort")
            {
                std::cout<<"BubbleSort : "<<std::endl;
                s.bubble(t_, sort);
            }
            else 
            {
                std::cout<<"SelectionSort : "<<std::endl;
                s.selectionSort(t_, sort);
            }
            
        }

上面,我有一个正常排序的函数,并有一个字符串作为参数。我使用了 bind,如果选择是 bubbleSort,它可以正常工作,但如果选择是另一个字符串,它就不起作用,它会打印向量表正常,未排序 主要看起来像这样:

std::vector<int> table{ 244, 57, 78, 331, 9, 212, 6};
    MyData data(table);
    data.printVec();
    std::cout<<std::endl;
    data.sortNormal("bubbleSort"); //here if instead of buubleSort i type another string, it doesn't work 
    data.printVec();

有人知道为什么这个算法不行吗?它什么也没做,我不知道出了什么问题。

【问题讨论】:

  • 只有 min_idx = j;在内部 for 循环中。这似乎不太好
  • 我编辑过,还是一样的..
  • 可能问题出在未显示的代码中。请提供一个我们可以测试的完整示例
  • 完成了。现在可以查看了吗?
  • 请注意,我使用更简单的测试代码测试了您的 selectionSort,它可以正常工作

标签: c++ selection-sort


【解决方案1】:

你测试小于零:

if(func(vec[j],vec[min_idx]) < 0)

但你的实际函数只能返回 0 或 1:

int sortNormal2(int first, int sec)
{
    return first > sec;
}

所以if 分支永远不会被占用。

【讨论】:

  • 我应该修改什么?
  • @loveProgram 这应该是你自己想出来的。
  • 我试过但打印不正常,它打印:244 78 57 331 9 212 6
  • 如果此问题得到解答,您可以接受答案并发布新问题。但是像这样的问题最好使用调试器来回答。程序员的大部分时间都花在调试代码上,这很正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多