C++ c++;排序类向量

C++ c++;排序类向量,c++,class,sorting,qsort,C++,Class,Sorting,Qsort,我有一个类排序图: class sort_map { char key; int val; sort_map(int v, char k): key(k), val(v){} }; using namespace std; int comp_int(const void *a, const void *b) { return (*(sort_map*)b).val - (*(sort_map*)a).val); } int main () { vect

我有一个类
排序图

class sort_map {
    char key;
    int val;
    sort_map(int v, char k): key(k), val(v){}
};
using namespace std; 
int comp_int(const void *a, const void *b) {
    return (*(sort_map*)b).val - (*(sort_map*)a).val);
} 
int main () {
    vector <sort_map> v; 
    v.push_back(5, 'a');
    v.push_back(67, 'd');
    v.push_back(2, 'c');
    v.push_back(98, 'f'); 
    return 1;
}
但是当我用这个的时候,它是有效的

qsort(&v[0], v.size(), sizeof(sort_map), comp_int);
有人能告诉我为什么吗?

试着这样做:

sort_map* ptr1 = &v[0];
sort_map* ptr2 = &v.begin();
你会发现哪一个被编译,会发现这些表达式是不相等的

第一条语句将编译,因为
v[0]
的类型是
sort\u map
,因此对其应用
&a
将使其

sort\u map*

第二条语句的基类型是
vector::iterator
,它的地址是

iterator*

对于此
向量
类型。如您所见,
迭代器*
不能分配给
排序映射*
——它们不相似


qsort
接受
void*
而不强制编译器执行任何类型安全性。
void*
可以传递任何类型的指针,而不需要任何类型转换,因此它编译得很好。您将错误的内容传递给
qsort
。正如其他人建议的那样,您最好使用
std::sort

为什么要使用insteadAs
&v.begin()
获取迭代器的地址,而不是迭代器引用的数据
qsort
找错了位置。我想用qsort按val对向量排序——不,算了吧。使用
std::sort
。如果这是“要求您的作业使用
qsort
”。
std::is_pod
的返回值0表明,如果不调用未定义的行为,就无法使用qsort对
sort_map
进行排序。假设我们忽略编译错误,因为
sort_map
中的所有内容都是私有的,而
comp_int
中的所有内容都不是友好的。为什么
返回1在最后?
sort_map* ptr1 = &v[0];
sort_map* ptr2 = &v.begin();