Как будет выглядеть фрагмент кода Python на C++?
код:
def rotateLeft(d, arr):
return arr[d:] + arr[:d]
как можно делать вырезку из массивов (векторов) в C++ и "склеивать" их, не перебирая все значения циклом?
Ответы (2 шт):
после некоторых размышлений получилось написать следующие:
vector<int> rotateLeft(int d, vector<int> arr) {
vector<int> a(d);
move(arr.begin(), arr.begin() + d, a.begin());
move(arr.begin() + d, arr.end(), arr.begin());
move(a.begin(), a.end(), arr.end() - d);
return arr;
}
вроде работает
Не с той стороны идете...
Если нужно просто циклически сдвинуть - то есть стандартный алгоритм rotate:
vector<int> a{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
rotate(a.begin(),a.begin()+5,a.end());
for(int i: a) cout << i << " ";
Вот - https://ideone.com/myDQJS
Если нужно именно шаловливыми ручками, без привлечения стандартной библиотеки - опять же, совершенно ни к чему новый вектор использовать, все делается на месте, с помощью трех обращений порядка элементов - в двух кусках, слева и справа от точки поворота, и общего... Вот, тот же разворот на месте, без привлечения лишней памяти:
vector<int> a{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
for(int i = 0, j = 4; i < j; ++i, --j) swap(a[i],a[j]);
for(int i = 5, j = 19; i < j; ++i, --j) swap(a[i],a[j]);
for(int i = 0, j = 19; i < j; ++i, --j) swap(a[i],a[j]);
for(int i: a) cout << i << " ";
Если даже swap лишний - ну так:
void swap(int&x, int&y)
{
int t = x;
x = y;
y = t;
}
Убеждайтесь: https://ideone.com/RS6uxO