std sort似乎永远循环

Mr.*_*ome 1 c++ sorting std

现在我有一个类进行二分查找.该类接受一个向量,但后来我告诉该类进行排序.

我需要能够只通过名字潜在或姓氏排序,所以我设置一个字符参数作为该类中的一个选项来改变我对矢量的排序方式.我也在那个类中创建了一个operator()函数来使用*this,作为一个类指针来对向量进行排序.但它似乎只是永远循环.谁能告诉我为什么?代码如下.

*注意是否有一些我不遵循的一般做法随时通知我.我现在不想开始养成坏习惯.

按要求:Getname

void personType::getName(string& first, string& last)
{
    // get the name and set it
    first = firstName;
    last = lastName;
}


bool sBinary::operator()(studentType student1, studentType student2){
    string toCheck1, toCheck2, fName1,lName1 ,fName2 , lName2;
    student1.getName(fName1, lName1);
    student2.getName(fName2, lName2);
    toCheck1=checkStr(fName1, lName1);
    toCheck2=checkStr(fName2,lName2);
    return toCheck1<toCheck2;
}

string sBinary::checkStr(string fName, string lName){
    string toCheck;
    switch (choice){
    case 'f':
    case 'F':
        toCheck=fName;
        break;
    case 'l':
    case 'L':
        toCheck=lName;
        break;
    case 'r':
    case 'R':
        toCheck=fName+lName;
        break;
    default:
        toCheck=lName+fName;

    }

    return toCheck;

}


sBinary::sBinary(vector<studentType> _sList, char _choice){
    sList=_sList;
    steps=0;
    choice=_choice;
    sort(sList.begin(),sList.end(), *this);
}
Run Code Online (Sandbox Code Playgroud)

Lol*_*4t0 6

所以,似乎不是永远不会循环,而是执行太久.这是完全不同的故事.您的代码中有一些悲观:主要关注的是您传递*this给排序算法:

sort(sList.begin(),sList.end(), *this);
Run Code Online (Sandbox Code Playgroud)

std::sort通过价值来比较谓词,并将其复制多次.如果你定义了复制构造函数,你可以看到它:

sBinary(const sBinary& r):choice(r.choice), sList(r.sList)
{
    std::cout << "copied\n";
}
Run Code Online (Sandbox Code Playgroud)

并且您的矢量会随着对象本身一起被复制.

例如,如果数组大小为200,则std::sort复制对象13646次.这意味着,涉及2700000名学生的复制操作.

所以,你不应该传递*thisstd::sort.您最好定义静态函数lessThen而不是operator()将其传递给排序算法.

进一步改进:

  1. 通过引用传递,而不是通过值传递.例如,在你的lessThen函数声明中应该是这样的

    static bool lessThen(const studentType& student1, const studentType& student2);
                       //^^^^^            ^
                       //constant         reference
    
    Run Code Online (Sandbox Code Playgroud)
  2. 重构你的studentType课程.

    你最好有2个独立的函数,返回名字和姓氏(通过常量引用).在这种情况下,您可以摆脱将名称复制到临时变量.请注意,当您具有单个功能时,您必须复制名字和姓氏,即使永远不会使用一个名称:

    const std::string& first_name() const { return _fname; }
    const std::string& last_name() const { return _lname; }
    
    Run Code Online (Sandbox Code Playgroud)