c – 将元素移出关联容器

前端之家收集整理的这篇文章主要介绍了c – 将元素移出关联容器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
只是为了好玩,我已经实现了可以想象的最简单的排序算法:
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(),begin);
}

但这并没有显着影响性能,即使我正在对std :: strings进行排序.

然后我记得关联容器从外部是常量,也就是说,std :: move和std :: copy将在这里做同样的事情:(有没有其他方法将数据移出树?

解决方法

std :: set和std :: multiset只提供对其元素的const访问.这意味着你不能移动一些东西.如果您可以移出项目(或根本不修改它们),您可以通过更改项目的排序顺序来中断该项目.所以C 11禁止它.

因此,尝试使用std :: move算法只会调用复制构造函数.

猜你在找的C&C++相关文章