【问题标题】:Move an item of a container at the end (deque)在末尾移动一个容器的项目(双端队列)
【发布时间】:2020-04-13 01:24:48
【问题描述】:

有没有办法从容器中移动项目的位置?

我有兴趣在所属的双端队列末尾移动这个项目。

在上面的示例中,如何移动容器末尾的第二个元素?

std::deque<int> foo {1,2,3,4,5};

【问题讨论】:

  • 不清楚你的意思。澄清一下:您是否打算将项目从容器的末端移到该容器的外部?
  • 不,我的意思是改变它在同一个容器中的位置,而不是在它之外。
  • 您可以将项目与容器中的最后一个交换。
  • 这不是我想要的,因为我想保持其他人的秩序。就像通过在最后移动它来给予最低优先级

标签: c++ stl containers deque


【解决方案1】:

我想到的唯一可能的解决方案是以下与旋转有很大不同的解决方案:

template <typename T>
void moveToEnd(typename std::deque<T> & d, typename std::deque<T>::iterator  pos)
{
  if ( pos > d.end()-2 )
  {   
    cout << "wrong input" << endl;
    return;
  }

  for (auto i=pos; i!=d.end()-1; i++)
    swap(*i, *(i+1));
}

int main()
{

deque<int> deq {1,2,3,4,5,6};

std::deque<int>::iterator it = deq.begin()+2;
moveToEnd<int>(deq,it);
//std::rotate(deq.begin(), it, deq.end());

for (auto i=deq.begin(); i!=deq.end(); i++)
    cout<< *i << " ";

return 0;
}

我的轮换结果:3 4 5 6 1 2

moveToEnd 的结果:1 2 4 5 6 3

我想要的结果就是像泡沫一样走到最后

【讨论】:

    【解决方案2】:

    您可以从双端队列中删除您的项目并在最后推送它

    // be sure to have at least 6 items in your que
    auto myItem = myDeque.at(5); // save the item
    myDeque.erase(myDeque.begin(), myDeque.begin()+5); // remove it from que
    myDeque.push_back(myItem); // insert it at the end
    

    您也可以使用 std::swap,它允许您将您的项目与最后一个交换。 请注意,这会改变之前最后一个元素的相对顺序。

    【讨论】:

    • 这是我现在正在做的解决方法(删除并再次添加),我做了两次效率不高的操作
    【解决方案3】:

    有什么方法可以...改变 [item's] 在同一个容器中的位置

    是的。例如,std::swap 就是这样做的。

    如果您想保持其他元素的顺序,以便以前的最后一个元素不会去新的最后一个元素所在的位置,那么您要查找的操作是std::rotate。或者,您可以简单地删除元素,然后重新插入到末尾。

    【讨论】:

    • 您好,eerorika,感谢您的回复!你的意思是std::swap,对吧?我已经更新了我的帖子。在我提到的示例中,如何移动容器末尾的第二个元素?在下面的链接中,它只提到了两个容器之间的交换。 cplusplus.com/reference/deque/deque/swap-free
    • @Nebula 不要在容器上使用交换,而是在元素上使用它。
    • 是的,但这会将第二个元素与最后一个元素交换。我希望第二个元素像泡沫一样结束。与删除和 push_back 的结果相同
    • 您好!请看我的下一个答案,看看我想做什么..
    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多