2016-02-12 4 views
0

У меня есть unordered_set называемые уравнения. Я не сортировать или QSort это и это строка кода им работает, чтобы сделать это:Qsort или Сортировать по 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 и сортировать это.

также использовать СТЛ алгоритмы сортировки:

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; 
} 
Смежные вопросы