只是为了好玩,我实现了可以想象的最简单的排序算法:
template<typename Iterator>
void treesort(Iterator begin, Iterator end)
{
typedef typename std::iterator_traits<Iterator>::value_type element_type;
// copy data into the tree
std::multiset<element_type> tree(begin, end);
// copy data out of the tree
std::copy(tree.begin(), tree.end(), begin);
}
它只比std::sort
我的测试数据慢 20 倍 :)
接下来,我想通过移动语义来提高性能:
template<typename Iterator>
void treesort(Iterator begin, Iterator end)
{
typedef typename std::iterator_traits<Iterator>::value_type element_type;
// move data into the tree
std::multiset<element_type> tree(std::make_move_iterator(begin),
std::make_move_iterator(end));
// move data out of the tree
std::move(tree.begin(), tree.end(), begin);
}
但这并没有显着影响性能,即使我正在排序std::string
s。
然后我记得关联容器从外部来看是恒定的,也就是说,std::move
并且std::copy
会在这里做同样的事情:(还有其他方法可以将数据移出树吗?