2014-06-19 124 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