如何使用 boost 库中的 integer_sort?

Posted

技术标签:

【中文标题】如何使用 boost 库中的 integer_sort?【英文标题】:How use integer_sort from boost library? 【发布时间】:2017-08-26 12:14:45 【问题描述】:

我使用 boost/range/algorithm.hpp 中的 boost::sort(),但它真的...慢,而且我只是使用无符号整数类型,所以我想“也许使用 boost/sort 中的 integer_sort() /spreadsort/integer_sort.hpp 我可以提高速度” 问题是 std::sort(v.begin(), v.end()) 在 ~54 秒内运行, boost:sort(v) 在 ~54 秒内运行(同时)

但我写了类似基数排序的东西,大约需要 28 秒,但我认为 integer_sort 可以比我的代码更优化,但我不知道如何使用 integer_sort。

#include <vector>
#include <boost/range/algorithm.hpp>
#include <boost/sort/spreadsort/integer_sort.hpp> // I WANT USE THIS
#include "myLib.hpp"

using namespace std;

int main(void)

  vector <unsigned> v(20);

  for (unsigned i = 0; i < v.size(); i++)
    v[i] = rand() % 1000;

  imprime(v); // THIS PRINTS THE VECTOR
  boost::sort(v); // THIS SORT THE VECTOR
  imprime(v);
  integer_sort(v.begin(), v.end()); // THIS DOES'T WORK

  return 0;

如果我尝试使用 integer_sort(v.begin(), v.end());我明白了

sort.cpp: In function ‘int main()’:
sort.cpp:23:34: error: ‘integer_sort’ was not declared in this scope
   integer_sort(v.begin(), v.end());
                                  ^
sort.cpp:23:34: note: suggested alternatives:
In file included from sort.cpp:5:0:
/usr/include/boost/sort/spreadsort/integer_sort.hpp:173:15: note:   ‘boost::sort::spreadsort::integer_sort’
   inline void integer_sort(RandomAccessIter first, RandomAccessIter last,
               ^~~~~~~~~~~~
In file included from /usr/include/boost/sort/spreadsort/integer_sort.hpp:26:0,
                 from sort.cpp:5:
/usr/include/boost/sort/spreadsort/detail/integer_sort.hpp:482:5: note:   ‘boost::sort::spreadsort::detail::integer_sort’
     integer_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
     ^~~~~~~~~~~~

我知道这与 (v.begin(), v.end()) RandomAccessIter first std::sort(v) 时得到了类似的结果 candidate expects 3 arguments, 1 provided。

那么如何使用 integer_sort()?

Boost Doc 说:

integer_sort、float_sort 和 string_sort 中的每一个都有 3 个主要版本:基本版本,它采用第一个迭代器和一个最后一个迭代器,就像 std::sort:

integer_sort(array.begin(), array.end());
float_sort(array.begin(), array.end());
string_sort(array.begin(), array.end());

【问题讨论】:

尝试猜测建议替代方案中的boost::sort::spreadsort::integer_sort 行的含义。还有你之前为什么写boost::sort Related boost bug report(不是完全相同的问题,但在这种测试中您可能会遇到)。 【参考方案1】:

您在调用 integer_sort 时缺少命名空间限定条件。

integer_sort 位于boost::sort::spreadsort 命名空间中(请参阅the documentation)。所以你的电话应该是这样的:

boost::sort::spreadsort::integer_sort(v.begin(), v.end());

还请注意,如果您尝试在同一程序中使用boost::sortBoost.Sort 库,则会遇到问题,因为boost::sort 函数模板与Boost.Sort 命名空间冲突(请参阅the bug report)。

boost::sort 只是std::sort 的包装器,因此预计两者将具有相同的性能。

boost::sort::spreadsort::integer_sort 如果数据量太小(低于boost::sort::spreadsort::detail::min_sort_size)将使用std::sort,因此对于小数据量,预计它们也具有几乎相同的性能(直到@987654336 的额外成本@检查是否使用std::sort)。

【讨论】:

以上是关于如何使用 boost 库中的 integer_sort?的主要内容,如果未能解决你的问题,请参考以下文章

*.pyd 库中的 C++ Boost Python 方法不起作用

在 Boost Property 树库中,我如何以自定义方式处理文件未找到错误(C++)

哪种算法需要“访问者”(boost 库中的术语)?

c++ boost库中累加器的用途是啥?

模拟实现c++标准库和boost库中的智能指针

C++11实现的Boost库中的Any类