使用 qsort() 时对包含C++字符串的类进行不正确/错误的排序
Incorrect/buggy sorting of classes containing C++ strings when using qsort()
我在编译此代码时遇到了一个奇怪的错误。它与我学习的书中相同,但似乎在某处感到困惑,因为我的输出关闭,年龄和名称混合在一起,例如( 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::array
和 std::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;
}
相关文章:
- 将图形表示为unordered_map<字符串、向量>时拓扑排序错误<string>
- C++插入排序错误功能不起作用
- C++ 换行符上的合并排序错误中断
- C++ 快速排序错误
- 合并排序错误 - 表达式必须具有常量值
- C 插入排序错误
- 对向量 OS 字符串进行排序 C++ 错误 C2784 无法推断模板参数
- 递归合并排序错误
- 使用C++的快速排序错误
- std::使用自定义类排序错误
- 使用类在 C++ 中快速排序错误
- 数组中的函数排序错误
- 插入排序错误
- C++部分排序错误
- sort对某些值排序错误
- 针对c++ STL的自定义比较器排序错误预期-在')'标记之前的主表达式
- 气泡排序错误LNK2019
- 链表的归并排序错误
- 快速排序错误:变量周围的堆栈已损坏
- 排序错误:不允许使用类型名称