C++ 排序 class 向量
c++ sorting class vector
我有一个 class 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);
谁能告诉我为什么?
尝试这样做:
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
我有一个 class 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);
谁能告诉我为什么?
尝试这样做:
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