我正在尝试排序" sth"使用qsort在类Entry的向量内的整数值。其代码如下。但在应用qsort之后,值也保持不变。当我尝试在cmpfunc2()中打印值时,我发现0 0正在打印。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Entry{public:
int id;
int sth;
Entry(int,int);
};
Entry::Entry(int a,int b){
id=a;
sth=b;
}
int cmpfunc2 (const void * a, const void * b)
{
cout<<(*(Entry *)a).sth<<" "<<(*(Entry *)b).sth <<endl;
return ( (*(Entry*)a).sth - (*(Entry*)b).sth );
}
int main(){
vector<Entry> entries;
entries.push_back(Entry(2,3));
entries.push_back(Entry(21,14));
entries.push_back(Entry(54,12));
qsort(&entries, entries.size(),sizeof(Entry),cmpfunc2);
for(int i=0;i<entries.size();i++)
cout<<entries[i].sth<<endl;
}
答案 0 :(得分:3)
更改此声明
qsort(&entries, entries.size(),sizeof(Entry),cmpfunc2);
到
qsort( entries.data(), entries.size(), sizeof( Entry ), cmpfunc2 );
然而,最好使用标头std::sort
中声明的标准算法<algorithm>
。例如
#include <algorithm>
//...
bool cmpfunc2 ( const Entry &a, const Entry &b )
{
return ( a.sth < b.sth );
}
// ...
std::sort( entries.begin(), entries.end(), cmpfunc2 );
或者您可以使用std::stable_sort
std::stable_sort( entries.begin(), entries.end(), cmpfunc2 );
还要考虑将Entry
类型的对象作为std::pair
类型的对象进行比较的可能性。在这种情况下,具有相同sth的对象将根据id进行排序。例如
#include <algorithm>
#include <utility>
//...
bool cmpfunc2 ( const Entry &a, const Entry &b )
{
return ( std::make_pair( a.sth, a.id ) < std::make_pair( b.sth, b.id ) );
}
答案 1 :(得分:3)
好的,我正在作为答案发表评论。
首先,查看qsort的文档。 第一个参数 ptr - 指向要排序的数组的指针。
所以,如果你真的想要使用qsort和一个向量(这很奇怪,std :: sort就在那里)你的问题的答案就是回答问题“如何将向量转换为原始数组? ”。
您需要使用小型黑客 - &amp; entries [0] - 指向向量的第一个元素的指针。它是有效的,因为向量中的元素与标准有关,具有连续的内存位置,这与原始数组相同。
在新标准中,向量有 data()函数成员。您可以使用此成员函数
答案 2 :(得分:2)
您将&entries
传递给qsort
应该是:
qsort(&entries[0], entries.size(), sizeof(Entry), cmpfunc2);
答案 3 :(得分:1)
A)使用std::sort()
与entries.begin()
和entries.end()
- &gt;更快
OR
B)使用qsort()
与&entries.front()
代替&entries
- &gt;慢