如何使用 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::sort
和Boost.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 方法不起作用