需要移动双端队列中的元素。代码不工作

Need to shift elements in deque. Code not working

我想要一个根据输入索引 u 移动的函数。如果 u 为负,则向右移动,否则向左移动。使用下面的代码生成的 deque 与输入相同。

deque<float> move(deque<float>p, int u)
{
    if(u==0 || p.size()==1)
        return p;

    else if(u<0)
    {
        for(int i=0; i<abs(p.size()); i++)
        {
            int temp = p.back();
            p.pop_back();
            p.push_front(temp);
        }       
    }

    else
    {
        for(int i=0; i<p.size(); i++)
        {
            int temp = p.front();
            p.pop_front();
            p.push_back(temp);
        }
    }

    return p;
  }

此代码的另一个变体似乎在 Python 中运行良好但在 C++ 中却不行:

deque<float> move1(deque<float>p, int u)
{
    deque<float> q;

    for(int i=0; i<p.size(); i++)
        q.push_back(p[(i-u) % p.size()]);

     return q;
 }

您实际上并不是将它向左或向右移动一步,而是向左或向右移动的次数与项目的数量一样多。当然,这将导致与原来相同的顺序。

去掉循环以获得你想要的结果

deque<float> move(deque<float>p, int u)
{
    if(u==0 || p.size()==1)
        return p;

    else if(u<0)
    {
        for(int i=0; i<-u; i++)
        {
            int temp = p.back();
            p.pop_back();
            p.push_front(temp);
        }
    }

    else
    {
        for(int i=0; i<u; i++)
        {
            int temp = p.front();
            p.pop_front();
            p.push_back(temp);
        }
    }

    return p;
}

第二个代码应该能正常工作。它访问由 u 步移动的元素并将它们存储在另一个双端队列中,并返回它。什么不适用于它?

对于你的第二个问题,如果 u 大于 i(i-u) % p.size() 将为负数,因为 % 运算符不改变符号。

您可以改用 (i - u + p.size()) % p.size()

如果您使用标准库中的 std::rotate,您的代码会简单得多。例如:

std::deque<float> move(std::deque<float> p, int u)
{
    if (u == 0 || p.empty()) {
        return p;
    }
    if (u < 0) {
        std::rotate(p.begin(), std::prev(p.end(), -u), p.end());
    } else {
        std::rotate(p.begin(), std::next(p.begin(), u), p.end());
    }
    return p;
}