我试图使用tbb :: parallel_sort同时排序2个数组.英特尔的文档在这里说
https://software.intel.com/en-us/node/506167对迭代器和序列的要求与std :: sort相同.这似乎不是这种情况.我的自定义迭代器与std :: sort完美配合,但是使用tbb :: parallel_sort产生编译错误.请看下面的代码:
int main()//needs boost and tbb to compile { int values_size = 6; int nums1[] = {5,8,7,89,56,4}; int nums2[] = {2,1,4,9,2}; //WORKS! std::sort(do_dual_sort.make_iter(nums1,nums2),do_dual_sort.make_iter(nums1+values_size,nums2+values_size),do_dual_sort.make_comp_desc(nums1,nums2)); //DOESN'T COMPILE tbb::parallel_sort(do_dual_sort.make_iter(nums1,nums2)); for(unsigned int i = 0; i < values_size; i++) cout << "nums1[" << i << "] " << nums1[i] << " | nums2[" << i << "] " << nums2[i] << "\n"; return 0; } class dual_sort { public: template <class T,class T2> struct helper_type { public: typedef boost::tuple<typename iterator_traits<T>::value_type,typename iterator_traits<T2>::value_type> value_type; typedef boost::tuple<typename iterator_traits<T>::value_type&,typename iterator_traits<T2>::value_type&> ref_type; }; template <typename T1,typename T2> class dual_iterator : public boost::iterator_facade<dual_iterator<T1,T2>,typename helper_type<T1,T2>::value_type,boost::random_access_traversal_tag,T2>::ref_type> { public: explicit dual_iterator(T1 iter1,T2 iter2) : mIter1(iter1),mIter2(iter2) {} typedef typename iterator_traits<T1>::difference_type difference_type; private: void increment() { ++mIter1; ++mIter2; } void decrement() { --mIter1; --mIter2; } bool equal(dual_iterator const& other) const { return mIter1 == other.mIter1; } typename helper_type<T1,T2>::ref_type dereference() const { return (typename helper_type<T1,T2>::ref_type(*mIter1,*mIter2)); } difference_type distance_to(dual_iterator const& other) const { return other.mIter1 - mIter1; } void advance(difference_type n) { mIter1 += n; mIter2 += n; } T1 mIter1; T2 mIter2; friend class boost::iterator_core_access; }; template <typename T1,typename T2> dual_iterator<T1,T2> make_iter(T1 t1,T2 t2) { return dual_iterator<T1,T2>(t1,t2); } template <class T1,class T2> struct iter_comp_desc { typedef typename helper_type<T1,T2>::value_type T; bool operator()(const T& t1,const T& t2) const { return get<0>(t1) > get<0>(t2); } bool operator()(const char*& t1,const char*& t2) const { return strcmp(get<0>(t1),get<0>(t2)) == 1; } }; template <class T1,class T2> iter_comp_desc<T1,T2> make_comp_desc(T1 t1,T2 t2) { return iter_comp_desc<T1,T2>(); } } do_dual_sort;
我得到的编译错误是:
error C2512: 'dual_sort::dual_iterator<T1,T2>' : no appropriate default constructor available with [ T1=int *,T2=int * ] tbb44_20150728oss\include\tbb/parallel_sort.h(201) : see reference to function template instantiation 'void tbb::internal::parallel_quick_sort<RandomAccessIterator,Compare>(RandomAccessIterator,RandomAccessIterator,const Compare &)' being compiled with [ RandomAccessIterator=dual_sort::dual_iterator<int *,int *>,Compare=dual_sort::iter_comp_desc<int *,int *> ] main.cpp(1125) : see reference to function template instantiation 'void tbb::parallel_sort<dual_sort::dual_iterator<T1,dual_sort::iter_comp_desc<T1,T2>>(RandomAccessIterator,const Compare &)' being compiled with [ T1=int *,T2=int *,RandomAccessIterator=dual_sort::dual_iterator<int *,int *> ]