使用 qsort() 时对包含C++字符串的类进行不正确/错误的排序

Incorrect/buggy sorting of classes containing C++ strings when using qsort()

本文关键字:排序 错误 不正确 字符串 qsort C++ 包含 使用      更新时间:2023-10-16

我在编译此代码时遇到了一个奇怪的错误。它与我学习的书中相同,但似乎在某处感到困惑,因为我的输出关闭,年龄和名称混合在一起,例如( darko 4、zdendk 3、matija 2、draga(不知道"n"在哪里消失了(1(它说无效的指针。帮助我理解为什么会发生这种情况。

#include <iostream>
#include <math.h>
#include <cstdlib>
//#include "Tablica.h"
using namespace std;
/*
 * 
 */
struct Person {
    string name;
    int age;
};
int compare (const void* a, const void* b){
  const Person* p1 = static_cast<const Person*>(a);
  const Person* p2 = static_cast<const Person*>(b);
  if(p1->age != p2->age)
  return p2->age - p1->age;
  return p1->name.compare(p2->name); 

}

int main(int argc, char** argv) {
    Person people[]{{"darko", 1},{"zdendka", 2},{"matija", 3},{"dragan", 4}};
    int numP = sizeof(people) / sizeof(Person);
    qsort(people, numP, sizeof(Person), compare);
    for(Person x:people){
       cout<< x.name <<" "<<x.age<<endl;
    }
    return 0;
}

使用 VC++ 编译此程序,输出为

dragan 4
matija 3
zdendka 2
darko 1

这是完全有道理的,因为线条

 if(p1->age != p2->age)
  return p2->age - p1->age; 
总是

启动(年龄总是不同的(,使数组根据年龄而不是名称进行排序。

正如您在评论中所说,最好使用真正的C++技术,例如使用 std::arraystd::sort ,毫不奇怪,代码会更小,并且运行速度会更快。

守则,C++方式:

class Person {
private:
    string name;
    int age;
public:
    Person() = default;
    Person(const string& name, unsigned int age):
      name(name), age(age) {}
    Person(const Person& rhs) = default;
    Person(Person&& rhs) = default;
    string getName() const {return name;}
    unsigned int getAge() const {return age;}
};
int main(){
   array<Person,4> people{{"darko", 1},{"zdendka", 2},{"matija", 3},{"dragan", 4}};
   sort(people.begin(),people.end(),[](auto a, auto b){  
      return a.getName() < b.getName();
   });
   for (const auto& person : people){
       std::cout<< person.getName() <<" , " << person.getAge()<<"n";
   } 
   return 0;
}