2016-02-12 80 views
0

我有一個unordered_set稱爲方程。我不是來排序或快速排序是,這是跑辦代碼IM線:Qsort or Sort on unordered_set

qsort(&equations, equations.size(), sizeof(string), strcmp); 

我得到的錯誤是:

error: cannot convert 'std::unordered_set<std::basic_string<char> >' to 'void*' 
     for argument '1' to 'void qsort(void*, size_t, size_t, __compar_fn_t)'     
qsort(equations, equations.size(), sizeof(string), strcmp); 
+1

A)'unordered_set'無法排序。您需要將其內容複製到一個'vector',或者用你自己的排序標準使用'std :: set'。 B)'qsort'是一個C函數。它不會理解如何處理用戶定義的類型,如C++容器。你可能想要'std :: sort'。 – juanchopanza

+0

排序的語法是什麼? @juanchopanza – user3121369

+1

看看。這裏有大約二百億個問題。 – juanchopanza

回答

2

您需要將unordered_set複製到vector並對其進行排序。

還可以使用STL算法排序:

std::sort(v.begin(), v.end()); 
std::sort(v.begin(), v.end(), std::greater<int>()); 
+0

另請注意,C++ std :: sort比C qsort更快。其中一個主要原因是,比較fcn的編譯時綁定在C++中是可能的,在C qsort中,函數指針用於比較。 –

+0

並且還要注意,如果OP可以使用'std :: set',則他們不必排序。 – juanchopanza

+0

@ErikAlapää當天返回(VS6)我實現了BWT算法,使用STL'sort'顯然比C'qsort'慢。出於絕望,我嘗試了'stable_sort',並立即將速度相提並論。所以,說一個比另一個更快並不總是對的 - 這取決於被排序的數據。 –

0

如果你可以使用一個std::set來存儲你的std::unordered_set你可以只初始化一個新std::set有序版本使用std::unordered_set::begin()std::unordered_set::end()

#include <iostream> 
#include <unordered_set> 
#include <set> 


int main() 
{ 
    std::unordered_set<int> unordered = { 9,1,8,2,7,3,6,4,5 }; 
    std::set<int> ordered(unordered.begin(), unordered.end()); 

    std::cout << "Before: "; 
    for (auto iter = unordered.begin(); iter != unordered.end(); ++iter) 
    { 
     std::cout << *iter << ", "; 
    } 
    std::cout << std::endl; 

    std::cout << "After: "; 
    for (auto iter = ordered.begin(); iter != ordered.end(); ++iter) 
    { 
     std::cout << *iter << ", "; 
    } 
    std::cout << std::endl; 
}