2017-04-01 8 views
0

私はboost/range/algorithm.hppからboost :: sort()を使用していますが、実際は遅いです。符号なしの整数型で作業しているので、「boost/sort /スピードを向上させることができます " 質問は、std :: sort(v.begin()、v.end())が〜54秒で実行され、boost:sort(v)〜54秒(同じ時刻)boost_libraryからinteger_sortを使用するにはどうすればよいですか?

しかし、私は基数ソートのようなものを書いて〜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())を試してみてください。これは正しくない - 私はstd::sort(v) <をしようとすると、私は似た何かを得る - 私はこれが(v.begin()、v.end())RandomAccessIter first <とは何かを持っていることを知っている

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, 
    ^~~~~~~~~~~~ 

を取得します。しかし、私はエラーメッセージを理解していません。 std :: sortのようにcandidate expects 3 arguments, 1 providedと言ってはいけません。

どのようにinteger_sort()を使用しますか?

Boost Docは言う:

integer_sort、float_sort、およびstring_sortの各3つの主なバージョンがあります:

integer_sort(array.begin(), array.end()); 
float_sort(array.begin(), array.end()); 
string_sort(array.begin(), array.end()); 
:だけのstd ::並べ替えのように、最初のイテレータと最後のイテレータを取るベースバージョンを、
+3

提案されている代替手段の中で 'boost :: sort :: integer_sort'行が何を意味するのか推測してみてください。そしてなぜあなたは以前に 'boost :: sort'を書きましたか? –

+1

[Related boost bug report](https://svn.boost.org/trac/boost/ticket/11202)(これはまったく同じ問題ではありませんが、この種のテストでは実行する可能性があります)。 – Mankarse

答えて

1

integer_sortへの呼び出しで、名前空間の資格が不足しています。

integer_sortは、boost::sort::spreadsort名前空間にあります(the documentation参照)。だからあなたの呼び出しは次のようになります。

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

も(the bug reportを参照してください)あなたはBoost.Sort名前空間でboost::sort関数テンプレートの競合として、同じプログラムでboost::sortBoost.Sortライブラリを使用しようとした場合、あなたが問題を抱えているだろうことに注意してください。

boost::sortは、std::sortの単なるラッパーであるため、2つが同じ性能を持つことが期待されます。データサイズが(boost::sort::spreadsort::detail::min_sort_sizeの下)が小さすぎる場合、小さなデータのために、彼らがあまりにも(std::sortかを使用するかどうかをチェックするinteger_sortの余分なコストまでほぼ同じ性能を有することが予想されるサイズので

は、std::sortを使用します。ない)。

関連する問題