编译此代码时出现了一个奇怪的错误。它与我正在研究的书中的相同,但它似乎在某处混淆,因为我的输出关闭,年龄和名称混合例如(暗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;
}
答案 0 :(得分:2)
使用VC ++编译该程序,输出为
dragan 4
matija 3
zdendka 2
darko 1
这很有道理,因为行
if(p1->age != p2->age)
return p2->age - p1->age;
总是开始(年龄总是不同),使数组按照年龄而不是名称进行排序。
正如您在评论中所说的那样,最好使用真正的C ++技术,例如使用std::array
和std::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;
}