2014-06-19 80 views
1

我正尝试使用qsort对类Entry的向量内的“sth”整数值进行排序。代码相同如下。但是在应用qsort之后,值也保持不变。当我试图在cmpfunc2()中打印值时,我发现0 0正在打印。将矢量传递给qsort

#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

&条目是矢量 *。你需要&entries [0] – grisha

+0

只是好奇,为什么使用'qsort'而不是'std :: sort'? – Paul

+2

@ user2451677你应该让这个答案... –

回答

1

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

OR

B)使用qsort()&entries.front()代替&entries - >慢

+0

不一定比较慢。取决于实施。我见过qsort更快,尤其是如果它专门用于单一数据类型的话。 – keltar

2

你通过&entriesqsort它应该是:

qsort(&entries[0], entries.size(), sizeof(Entry), cmpfunc2); 
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); 

还要考虑到posiibility Entry类型的比较对象为std::pair类型的对象。在这种情况下,具有相同性质的对象将根据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)); 
} 
3

好吧,我正在为我的答案的评论。

首先,查看qsort的文档。 第一个参数ptr - 指向要排序的数组的指针。因此,如果你真的想用矢量qsort(这很奇怪,std :: sort存在),你的问题的答案是问题的答案“如何将矢量转换为原始数组? ”。

你需要使用一个小的破解 - &条目[0] - 指向矢量的第一个元素的指针。这是行得通的,因为向量中的元素与标准相关,具有连续的内存位置,这与原始数组相同。

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

+1

注意'&entries [0]'是UB,如果entries.empty()是真的。 '.datta()'在这种情况下返回'nullptr'。 – Yakk

+0

的cource。由于这个问题的例子,我没有写这个笔记。 – grisha