我有一个强大的用例来定义我自己的排序算法,它比stl中的最快算法更快,并且通过利用我基本上可以在O(n)
中排序的基础数据的一些不错的属性。
到目前为止一直很好,现在的问题是我想提供适合任何类型容器的通用接口,例如: T*
或std::vector<T>
等等,只要有几个关键概念适用,例如
为了获得想法,我转到了头文件<std_algo.h>
,发现下面的函数接口与我正在寻找的内容完全匹配,除了一个细节,我没有看到如何循环通过底层{{1}编译器忽略容器类型将自动矢量化这是我的问题...有没有办法让我拥有它?自动矢量化+通用接口忽略底层集合类型?
我认为下面的代码不会自动向量化,因为“非规范”循环模式_RandomAccessIterator
和while (__last - __first > int(_S_threshold))
之类的条件,但最后我在算法中不需要。所以我看到非规范类型的循环会阻止自动矢量化。
if (__depth_limit == 0)
有问题的循环如下所示:
template<typename _RandomAccessIterator, typename _Compare>
inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
{
typedef typename iterator_traits<_RandomAccessIterator>::value_type
_ValueType;
// concept requirements
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
_RandomAccessIterator>)
__glibcxx_function_requires(_BinaryPredicateConcept<_Compare, _ValueType,
_ValueType>)
__glibcxx_requires_valid_range(__first, __last);
if (__first != __last)
{
std::__introsort_loop(__first, __last,
std::__lg(__last - __first) * 2, __comp);
std::__final_insertion_sort(__first, __last, __comp);
}
}
答案 0 :(得分:2)
标准C ++库在标准算法中使用迭代器,例如sort()。这允许算法实现忽略底层容器的确切细节。此外,此方法不允许使用operator[]()
进行索引。
考虑到这一点,我有两个建议供您考虑:
1)修改您的专用排序以使用迭代器,而不是operator[]()
来访问容器中的元素。如果可以保持你想要的O(n)速度,那么这可能是最理想的灵活方法。
2)使用templatized的容器类实现排序。像
这样的东西template <class Container, class Compare>
void sort(Container cont, Compare comp);
应该这样做。
答案 1 :(得分:0)
关于模板的精彩之处在于,在填充模板类型之前,它们不会完全编译,因此编译器可以根据最终代码应用优化。 T*
指针满足随机访问迭代器的所有必需属性,并且可以在任何需要它们的模板代码中轻松使用。
vector<float> v;
// load v
sort(&v[0], &v[v.size()]); // same as sort(v.begin(), v.end()) but possibly optimized better