C++ 排序类 vector

标签 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 对 vector 进行排序,但它不起作用。

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

关于C++ 排序类 vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37711636/

相关文章:

c++ - 对 `Cat::Grizzly()' 的 undefined reference |

c++ - 一个普通的链表

C++ 如何将此类实例的 boost 共享指针传递给嵌套类对象?

java - 使用 TreeSet 进行排序而不向其提供比较器

java - 我想通过使用另一个带有交换方法的类而不是通常可用的通用交换函数来交换两个数字

c++ - 何时使用 Malloc 而不是 New

c++ - 使用 C 从 C++ 访问公共(public)类内存

html - 具有CSS背景类的多个背景

c++ - 如何覆盖基类成员的类型?

javascript - JavaScript 中的部分排序