Необходимо переместить элементы в deque. Код не работает

83
13

Мне нужна функция, которая сдвигается в соответствии с входным индексом 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, но не в С++, является следующее:


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

спросил(а) 2015-06-20T08:15:00+03:00 5 лет, 4 месяца назад
1
Решение
71

На самом деле вы не переставляете его на один шаг влево или вправо, вы перемещаете его влево или вправо столько раз, сколько есть предметов. Это, конечно, приведет к тому же порядку, что и было.


Удалите петли, чтобы получить то, что вы хотите достичь

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, возвращая его. Что не работает с ним?

ответил(а) 2015-06-20T08:26:00+03:00 5 лет, 4 месяца назад
99

Ваш код может быть намного проще, если вы использовали 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;
}

ответил(а) 2015-06-20T09:49:00+03:00 5 лет, 4 месяца назад
57

Для вашего второго вопроса (i-u) % p.size() будет отрицательным, если u больше, чем i, так как оператор % не меняет знак.


Вместо этого вы можете использовать (i - u + p.size()) % p.size().

ответил(а) 2015-06-20T09:45:00+03:00 5 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема