【问题标题】:Qsort or Sort on an unordered_set对 unordered_set 进行 Qsort 或 Sort
【发布时间】:2016-02-12 10:23:56
【问题描述】:

我有一个unordered_set,叫做方程式。我不是要排序或 qsort 是,这是我正在运行的代码行:

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); 

【问题讨论】:

  • A) unordered_set 无法排序。您需要将其内容复制到例如vector,或使用带有您自己的排序标准的std::set。 B) qsort 是一个 C 函数。它不会理解如何处理用户定义的类型,例如 C++ 容器。你可能想要std::sort
  • 排序的语法是什么? @juanchopanza
  • 查一下。这里有大约 200 亿个问题。

标签: c++ sorting qsort unordered-set


【解决方案1】:

您需要将unordered_set 复制到vector 并对其进行排序。

同样使用 stl 算法进行排序:

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

【讨论】:

  • 另请注意,C++ std::sort 比 C qsort 快。主要原因之一是比较 fcn 的编译时绑定在 C++ 中是可能的,在 C qsort 中,函数指针用于比较。
  • 另外请注意,如果 OP 可以使用std::set,他们就不必排序了。
  • @ErikAlapää 过去 (VS6) 我实现了 BWT 算法,使用 STL sort 明显慢于 C qsort。出于绝望,我尝试了stable_sort,然后速度立即相当。因此,说一个比另一个快并不总是正确的 - 这取决于正在排序的数据。
  • @是的,总会有特殊情况。但总的来说,比较操作的编译时绑定很重要。
【解决方案2】:

如果您可以使用std::set 来存储您的std::unordered_set 的有序版本,您可以使用std::unordered_set::begin()std::unordered_set::end() 初始化一个新的std::set

#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多