我想要一个根据输入索引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;
}
答案 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()
。