Как сдвинуть массив влево c

от admin

Как сдвинуть массив влево или вправо в C ++?

как я могу переместить один элемент влево или более одного?

2 ответа

Использовать стандартный алгоритм std::rotate , объявленный в заголовке <algorithm>

можно записать проще

Также вы можете использовать стандартный алгоритм std::rotate_copy , если вы хотите, чтобы исходный массив не изменился.

Если ваш компилятор не поддерживает цикл, основанный на диапазоне, вы можете написать

Если у вас есть доступ к С++ 11, это можно сделать, создав std::valarray , а затем используя cshift function (что означает круговое смещение).

An std::valarray — это объект, который был разработан как часть С++ 2011, чтобы хранить массив значений, а затем легко выполнять операции над ними, такие как математические операторы и общие функции, такие как swap или shift .

Циклический сдвиг массива влево с помощью указателей

int * tempArr = Arr ; //Сохраняем указатель на начало основного массива Arr
int * temp =new int[ step ];
//Локальный массив для частичного копирования данных из Arr
memcpy ( temp , Arr , step *sizeof
( step )); //Копирование в temp части массива Arr

Arr += step ; //Смена адреса начала основного массива Arr на адрес своего же элемента по индексу step

memcpy ( tempArr , Arr , N *sizeof( N )); //Копирование данных на исходный адрес основного массива (В данный момент Адрес основного массива не исходный)
memcpy ( tempArr + N – step , temp , step *sizeof( step ));
//Копирование обрезанных данных в конец массива (В данный момент Адрес основного массива не исходный)

Arr -= step ;
//Возврат адреса основного массива в исходное положение

delete [] temp ; //Очистка памяти от созданного локально массива
>

void main ()
<
system ( “CLS” );
int N ;
int step ;

cout << “ЭЛЕМЕНТОВ В МАССИВЕ: “ ; cin >> N ;
cout << “ВЛЕВО НА: “ ; cin >> step ;
int * Arr =new int [ N ];
//Выделяем память под массив Arr

input ( Arr , N );
//Ввод данных в массив
show ( Arr , N );
//Отображение массива на экране
sdvig ( Arr , N , step % N );
//Сдвиг элементов на step влево
show ( Arr , N );
//Отображение массива на экране
delete [] Arr ;
//Очищаем память от Arr

=======================
Итак.
Первое с чем пришлось столкнутся – это обработка массива внутри функции, при этом было желание работать с массивом напрямую, а не как с его локальной копией. Решается это достаточно просто. У функции в качестве принимаемых параметров можно указывать указатель на ссылку на массив.

Второй вопрос – это вопрос, касающийся работы компилятора с выделяемой динамической памятью. Во время первых попыток написания функции Сдвиг мне стало видно, что если смещать адрес первого элемента массива, то позиция массива смещается, а вот память там и остается где была выделена. Так как вопрос утечки памяти имеет важное значение, то это однозначно стоит знать. Проще говоря массив вырывается из своей законной области памяти в чужое пространство (что-то типа воли захотел, с тюрьмы сбежал). В коде видно, что в функции сдвига сначала идет смещение указателя на несколько позиций, потом идет возвращение его на исходную. Делается это для корректного удаления выделенной беглецу памяти, так как уже было описано, память за массивом не бегает.

Дальше был вопрос самого алгоритма сдвига массива на несколько позиций используя указатели. Так как имя массива – это адрес первого элемента массива, то используя арифметику указателей можно легко поменять адрес начала на адрес любого из элементов массива. В том как у меня сделано, при смещении элементов сначала одна часть массива сместится влево, затирая начальный участок массива, но так как создается циклический массив, то эти затираемые данные будут нужны, поэтому создается новый массив, в который и копируется затираемый участок. Этот массив потом просто будет добавлен в конец.

Читать:
Какой объем углекислого газа образуется

Также полезным является то, что можно увидеть как работать с функцией memcpy, с помощью которой легко копируются данные из одного массива в другой.

Чтобы решить такую задачу нужно обязательно чуть-чуть соображать. Чтобы понять весь механизм лучше всего решить аналогичную задачу со сдвигом элементов в противоположную сторону. Это если кому-то интересно или кто-то учится однозначно будет только на пользу.

Сдвинуть элементы массива на k позиций

Дан массив. Нужно сдвинуть циклично элементы этого массива на 2 позиции влево.

пусть а — это массив для сдвига, а size_array — его размер и пусть массив будет целочисленный.

если нужно сдвинуть на какое то другое кол-во позиций, то обычно применяют последовательный сдвиг. Ещё можно завести массив, равный сдвигу, скопировать туда начальные элементы (memcpy) остальные элементы сдвинуть (memmove) и скопировать с дополнительно массива назад элементы в конец исходного массива.,

Сдвиг элементов массива

Мне нужна помощь, я знаю, что этот вопрос задавался раньше, но я не понимаю и не могу его решить, поэтому мне нужна помощь. Мне нужно переместить элементы моего массива в положение слева. Таким образом, если вход будет 1,2,3,4,5, то выход будет 2,3,4,5,1. У меня то же самое справа, но слева я не могу понять, пожалуйста, также объясните логику, спасибо.

7 ответов

Первая проблема — плохая индексация:

Вторая проблема — неправильная логика смещения элементов: Исправленная версия:

Как отобразить обе смены:

Обратите внимание, что ваш код очень похож на код C. В C ++ вы можете объявлять переменные в любом сегменте кода, а не только в начале. В C ++ вы можете объявить переменную в цикле for следующим образом: for(int i=0; i<. ) — нет необходимости в глобальной переменной i

Для справки, это будет хороший пример кода C ++, который решает проблему, с которой вы столкнулись:

А вот идеальный код на C ++:

Или вы можете использовать memmove (. ), спроектированный именно для этой цели, вот ваш образец:

Замените свой код (чтобы сдвинуть массив влево) приведенным ниже кодом.

Простой ответ, где все легко видно, удачи.

Возможно, вас заинтересует «векторное кодирование», это будет проще, если вы потратите на это немного времени:

Как уже говорили другие, все дело в индексах. В цикле for у вас почти всегда возникают проблемы, если ваше условие остановки i 0

Самый простой способ поменять местами элементы в C ++ — использовать std :: iter_swap ()

Поэтому для массива из 4 элементов для замены элементов 1 и 4 вы должны сделать следующее

Обратите внимание, что вам также необходимо #include <algorithm> , чтобы это работало

Основная логика функции заключается в том, что вы указываете расположение в памяти двух элементов, так как первый элемент массива также является его местоположением в памяти, вы можете передать a + n, когда n равно n-1 порядковый номер элемента, который вы хотите поменять местами

Похожие статьи