将矢量传递给qsort

时间:2014-06-19 10:03:15

标签: c++ sorting vector

我正在尝试排序" 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;
}

4 个答案:

答案 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;慢