使用qsort()

时间:2016-02-15 14:27:17

标签: c++ function-pointers

编译此代码时出现了一个奇怪的错误。它与我正在研究的书中的相同,但它似乎在某处混淆,因为我的输出关闭,年龄和名称混合例如(暗4,zdendk 3,matija 2,draga(不知道&#34) ; 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;
}

1 个答案:

答案 0 :(得分:2)

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

dragan 4
matija 3
zdendka 2
darko 1

这很有道理,因为行

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

总是开始(年龄总是不同),使数组按照年龄而不是名称进行排序。

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

Code,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;
}