Как будет выглядеть фрагмент кода Python на C++?

код:

def rotateLeft(d, arr):
    return arr[d:] + arr[:d]

как можно делать вырезку из массивов (векторов) в C++ и "склеивать" их, не перебирая все значения циклом?


Ответы (2 шт):

Автор решения: NanzeRT

после некоторых размышлений получилось написать следующие:

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

вроде работает

→ Ссылка
Автор решения: Harry

Не с той стороны идете...

Если нужно просто циклически сдвинуть - то есть стандартный алгоритм 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

→ Ссылка