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();