c++ - 标准 : container c++ move to front

标签 c++ list stl vector swap

我正在寻找一个像 std::list 这样可以有效地将元素移到前面的 std 容器:

a-b-c-d-e

将“b”移到前面:

a-c-d-e-b

标准容器中没有这样的功能。因此,我认为我必须结合 remove 和 push_front 函数,但有没有人能找到更好的主意?

提前致谢。

最佳答案

如果你不必维护其他元素的顺序, 那么最简单的解决方案无疑就是交换 您想要的元素与容器中的第一个元素。这个 将对所有容器有效。

否则,std::list 提供了一个 splice 操作,它可以 使用。我认为类似于以下内容:

void
moveToFront( 
    std::list<MyType>& list,
    std::list<MyType>::iterator element )
{
    if ( element != list.begin() ) {
        list.splice( list.begin(), list, element, std::next( element ) );
    }
}

这应该只用几个指针操作结束,并且 没有拷贝。另一方面,std::list 可能非常慢 一般(因为它的位置差);我会衡量非常 小心反对使用 std::vector 的天真实现, 以确保这是一场全局性的胜利。在这里消除所有拷贝 如果迭代找到你想要的元素可能不会成功 搬到前面要贵十倍。 (这个很多 取决于 MyType 的复制成本以及它的大小 是。如果 sizeof(MyType) 接近页面大小,或者 访问 MyType 最终会间接访问很多 分配的对象,locality 参数将不成立。)

使用std::vector,而不是明显的erase/insert

void
moveToFront( 
    std::vector<MyType>& list,
    std::vector<MyType>::iterator element )
{
    MyType tmp( *element );
    std::copy_backwards( list.begin(), std::prev( element ), element );
    *list.begin() = tmp;
}

这将导致比 erase 更少的拷贝(它复制 以下所有元素)insert(也复制所有 以下元素的——这意味着所有元素, 因为我们在开头插入)模式。

关于c++ - 标准 : container c++ move to front,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14579957/

相关文章:

c++ - 您如何在 Windows 上正确使用 Boost 的动态链接?

java - 从具有匹配名称的 List<Student> 中获取 Student 对象而不进行迭代 (Java)

c++ - 用作 std::multimap 删除范围的第一个和最后一个的递增迭代器

c++ - 从 STL 容器继承并删除 `new` 运算符以防止由于缺少虚拟析构函数而导致未定义的行为是否有意义?

c++:遍历 std::hash_map 的顺序

c++ - #define 以及如何使用它们 - C++

c++ - 外部库应该被包装吗?

c++ - 支持软实时的 Linux C++ 定时器

无法以正确的模式从文件复制/读取到列表

java - Hibernate列表映射问题