2015-12-05 148 views
0

我遇到問題。聲明中說,比賽結果是從標準輸入中讀取的,我必須按照解決問題的數量以遞減順序在屏幕上打印最終排名。這是我的代碼。在C++中對結構向量排序

#include <cstdio> 
#include <vector> 
#include <cstdlib> 
using namespace std; 

struct results 
{ 
    unsigned int id; //id of the team 
    unsigned int m; //number of solved problems 
}; 

int comparare(const void * i, const void * j) //compare function for qsort() 
{ 
    return -(*(unsigned int*)i - *(unsigned int*)j); 
} 

int main() 
{ 

    unsigned int n; 
    vector<results> standings; //initializing an array of structs 

    scanf("%u", &n); //the size of the vector 
    for(unsigned int i=0; i<n; ++i) 
    { 
    scanf("%u%u", &standings[i].id, &standings[i].m); //reading the elements 
    standings.push_back(results()); 
    } 

    qsort(standings, n, sizeof(results), comparare); //sorting the array 

    for(unsigned int i=0; i<n; ++i) 
    printf("%u %u\n", standings[i].id, standings[i].m); //print the sorted array 

    return 0; 
} 

當我想編譯代碼,編譯器發現錯誤

不能轉換「的std :: vector的」到「無效*」的說法「1」到「無效的qsort(無效*,爲size_t,爲size_t,__compar_fn_t)」

在該行 qsort(standings, n, sizeof(results), comparare);

我該怎麼做才能修復這個

+6

使用'std :: sort'。作爲eric建議的 – erip

+2

,請通過http://stackoverflow.com/questions/4708105/performance-of-qsort-vs-stdsort –

回答

5

如果你絕對必須在vector使用qsort(和你不應該),那麼你必須通過這樣的:

qsort(standings.data(), standings.size(), sizeof(results), comparare); 

vector::data取一個指向存儲陣列在vector。簡單地傳遞一個指向vector本身的指針將無濟於事。

請注意vector::data需要C++ 11;如果data不適用於您,請使用&vector[0]

不過說真的,just use std::sort

std::sort(standings.begin(), standings.end(), [](const results &lhs, const results &rhs) {return lhs.id < rhs.id;}); 

顯然拉姆達需要C++ 11;隨意爲更早的C++版本使用一個命名空間聲明的結構體。

0

您正在使用C構造,但應該使用更多的C++構造。 std::sort通常比qsort快,它的使用更直觀。以下是如何在沒有C++ 11的情況下重寫它的方法。

#include <iostream> 
#include <vector> 
#include <algorithm> 

struct results { 
    unsigned int id; //id of the team 
    unsigned int m; //number of solved problems 
}; 

// I guess you're trying to sort on number of solved problems. If not, change `.m` to `.id` 
bool comparare(const results lhs, const results rhs) { 
    return lhs.m > rhs.m; 
} 

int main() { 

    size_t n; 

    std::cout << "Enter number of results: " << std::endl; 
    std::cin >> n; 

std::vector<results> standings(n); // Creates std::vector of results with n elements 

    // read in id and number of problems solved 
    for(size_t i=0; i < n; ++i) { 
    std::cin >> standings[i].id >> standings[i].m; 
    } 

    // sort the array 
    std::sort(standings.begin(), standings.end(), comparare); 

    // output the sorted array's id 
    for(size_t i = 0; i < standings.size(); ++i) { 
    std::cout << "In " << i+1 << " place: " << standings[i].id << " with " << standings[i].m << " problems solved." << std::endl; 
    } 

    return 0; 
} 

以下是​​的例子。

0

如果值可能超過INT_MAX,那麼您的比較函數comparare不適用。例如,比較UINT_MAX0將返回UINT_MAX - 0作爲int會導致溢出。這是未定義的行爲,在普通平臺上它實際上是負面的。

使用該比較函數:

//compare function for qsort() 
int comparare(const void *i, const void *j) { 
    unsigned int ni = *(unsigned int*)i; 
    unsigned int nj = *(unsigned int*)j; 
    return (ni > nj) - (ni < nj); 
} 

它返回-101如果*i是分別小於,等於或大於*j更大。

在C++中還有其他更習慣的方法來對數組進行排序。