【发布时间】:2013-01-03 22:46:00
【问题描述】:
只是为了好玩,我实现了可以想象的最简单的排序算法:
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::strings。
然后我记得关联容器从外部看是不变的,即std::move 和std::copy 会在这里做同样的事情:( 有没有其他方法可以将数据移出树?
【问题讨论】:
-
你能给我们一些关于你正在排序的字符串的更多信息吗?您能否发布您的测试代码供我们使用?
-
看起来您正在尝试优化一些您知道可以通过简单地使用
qsort来进行更多优化的东西。这样做的目的是什么?学习移动语义? -
@svick 是的,我的主要问题是:如果我不再需要元素,如何将元素移出关联容器?我确信一般问题超越了我愚蠢的 Treesort 示例 :) 我修改了问题的标题并删除了分配器位,谢谢。
-
我怀疑答案是你不能——似乎没有弹出和返回。使该异常安全可能与在
std::vector上一样棘手,甚至更多。 -
你不能,但是 Howard Hinnant 做了一个扩展(我认为没有官方文件,但我可能错了),它可以让你从容器中提取一个节点,然后你可以移动它的值。所以也许在几年后,使用更新的标准......
标签: c++ sorting c++11 move-semantics multiset