在末尾移动容器的项目(双端队列)

Move an item of a container at the end (deque)

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

我有兴趣将此项移动到属于的双端队列的末尾。

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

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

Is there any way to ... change [item's] position in the same container

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

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

您可以从双端队列中删除您的项目并将其压入末尾

// 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,它允许您与最后一个交换您的项目。 请注意,这会更改之前最后一个元素的相对顺序。

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

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

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