【问题标题】:C++ list remove element from position and place at end [duplicate]C ++列表从位置删除元素并放置在末尾[重复]
【发布时间】:2014-02-05 22:10:30
【问题描述】:

在 c++ 中从 std::list 中删除一个元素并将其放在末尾的最佳方法是给当前元素和列表当然的迭代器。

这是我现在写的,我不确定是最好/正确的方法:

void MyClass::update(std::list<T> * memSegs, std::list<T>::iterator it){

    memSegs -> splice(
        memSegs -> end(),
        *memSegs,
        it
    );
}

【问题讨论】:

  • 定义最佳。为什么不只是push_back(*it); erase(it)
  • 我想最简单的就是我的意思,也许是恒定的时间......
  • @NiklasB.:Ew,复制元素,这绝对是不必要的,因为只需要移动节点。我认为 OP 的代码是完全正确的。
  • @Saher:那么你的方法有什么问题?
  • 如果你通过指针而不是引用传递列表,你必须担心它是否为空。试试 `void MyClass::update(std::list & memSegs, std::list::iterator it)`。

标签: c++ list c++11


【解决方案1】:

如果您关心其他元素的顺序,那么最简单的解决方案就是将it 指向的元素与容器中的最后一个元素交换。

std::swap(*it, memSegs->back());

否则std::list::splice确实似乎是最好的选择。

对于其他容器,例如std::vector,如果你想保持秩序(如果你不关心交换),那么你可以使用具有线性复杂度的std::rotate

std::rotate(it, std::next(it), std::end(*memSegs));

【讨论】:

  • 好主意 +1。不幸的是,我关心订单。这是针对我正在实施的驱逐政策,其中最后一个元素是最近最少使用的。
【解决方案2】:

从 cppreference 告诉我的内容来看,这确实看起来是最优的。恒定时间,元素移动。

【讨论】:

    猜你喜欢
    • 2020-11-20
    • 2020-07-28
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多