c ++排序类向量

时间:2016-06-08 19:48:51

标签: c++ class sorting qsort

我有一个班级sort_map

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 按val对矢量进行排序,但它无效。

qsort(&v.begin(), v.size(), sizeof(sort_map), comp_int);

但是当我使用它时,它可以正常工作

qsort(&v[0], v.size(), sizeof(sort_map), comp_int);

有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:-2)

尝试这样做:

sort_map* ptr1 = &v[0];
sort_map* ptr2 = &v.begin();

你会发现哪一个被编译,并且会发现这些表达式不相等。

第一个语句会编译,因为v[0]的类型是sort_map,因此应用&a会使它成为

sort_map*

第二个语句的基类型为vector<sort_map>::iterator,其地址为

iterator*

表示此vector类型。如您所见iterator*无法分配给sort_map* - 它们不相似。

qsort需要void*而不强制执行编译器中的任何类型安全void*可以传递任何类型的指针而不需要任何类型转换,因此编译得很好。你传递了一个错误的东西给qsort。正如其他人推荐的那样,您最好使用std::sort