将矢量传递给qsort

Passing vector to qsort

本文关键字:qsort      更新时间:2023-10-16

我正在尝试使用qsort对类Entry的向量中的"sth"整数值进行排序。相同的代码如下。但在应用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;
}

更改此语句

qsort(&entries, entries.size(),sizeof(Entry),cmpfunc2);

qsort( entries.data(),  entries.size(), sizeof( Entry ), cmpfunc2 );

然而,最好使用在报头<algorithm>中声明的标准算法std::sort。例如

#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 ) );
}

好的,我将发表我的评论作为回答。

首先,查看qsort的文档。第一个参数ptr-指向要排序的数组的指针。

因此,如果你真的想将qsort与向量一起使用(这很奇怪,std::sort就在那里(,你的问题的答案就是">如何将向量转换为原始数组?"问题的答案。

你需要使用一个小黑客-&entry[0]-指向矢量第一个元素的指针。它是有效的,因为向量中的元素,就标准而言,具有连续的内存位置,这与原始数组相同。

在新标准中,向量有data((函数成员。您可以使用此成员函数

您将&entries传递给qsort,它应该是:

qsort(&entries[0], entries.size(), sizeof(Entry), cmpfunc2);

A(std::sort()entries.begin()entries.end()->更快的一起使用

B(使用qsort()&entries.front(),而不是&entries->较慢的