需要在deque中移动元素。代码无效

时间:2015-06-20 05:15:37

标签: c++ arrays elements shift deque

我想要一个根据输入索引u移动的函数。如果你是负面的,向右移动,否则向左移动。使用下面的代码生成的<body> <div> <form> <div class = "buttons"> <input type="submit" id="call" value="call"> </div> </form> </div> </body>与输入相同。

deque

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

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;
  }

3 个答案:

答案 0 :(得分:5)

如果您使用标准库中的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;
}

答案 1 :(得分:2)

你实际上并没有将它向左或向右移动一步,你可以向左或向右移动它的次数。当然,这将产生与原样相同的顺序。

删除循环以获得您想要实现的目标

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步骤替换的元素,并将它们存储在另一个deque中,然后返回它。什么不合用?

答案 2 :(得分:1)

对于第二个问题,如果(i-u) % p.size()大于u,则i将为否定,因为%运算符不会更改符号。

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