Обмен разделами массива друг с другом в C ++ - PullRequest
1 голос
/ 02 сентября 2011

Есть ли простой способ поменять друг с другом участки (куски) массивов? То есть у меня есть массив:

array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
array[5] = 6;
array[6] = 7;
array[7] = 8;

и функция с именем swapSections(startX, endX, startY, endY), которая в значительной степени с учетом этих значений заменяет диапазон значений, определяемый endX - startX, на диапазон значений от StartY до endY, поэтому из моего примера ...

если x range = 2 и startX = 0 и y range = 3 и startY = 5, он поместит массив [0] и массив [1] туда, где находятся массив [5] и массив [6], а затем поместит массив [ 7] после массива [6], опуская все остальное на единицу. Я не уверен, как это сделать, и я физически копировал память во временный массив, но я думаю, что есть лучший способ сделать это. (кстати, конечный результат из моего примера будет):

array[0] = 6;
array[1] = 7;
array[2] = 8;    
array[3] = 3;
array[4] = 4;
array[5] = 5;
array[6] = 1;
array[7] = 2;

Ответы [ 4 ]

2 голосов
/ 02 сентября 2011

Самый простой способ поменять разделы массива с точки зрения читабельности и усилий - использовать стандартную функцию C ++ swap_ranges()

#include <iostream>
#include <algorithm>
int main()
{
    int a[8] = {1,2,3,4,5,6,7,8};

    std::cout << "Beforeswap: ";
    for(int i=0; i<8; ++i)
            std::cout << a[i] << ' ';
    std::cout << '\n';

    std::swap_ranges(a+0, a+2, a+5);

    std::cout << "After swap: ";
    for(int i=0; i<8; ++i)
            std::cout << a[i] << ' ';
    std::cout << '\n';
}

test: https://ideone.com/ZVv2M

..Но он будет заменять только поддиапазоны равной длины, а не неравной длины, как в вашем тестовом примере.Ваш случай на самом деле является комбинацией swap_ranges() и rotate().

1 голос
/ 02 сентября 2011

Возможно, вы захотите взглянуть на valarray и его фрагменты.

0 голосов
/ 02 сентября 2011

Предположим, у вас есть (или вы можете создать) функцию для изменения диапазона элементов на месте, что-то вроде reverse(array, start, end).Затем вы можете выполнить эту задачу в четыре этапа:

// (1) reverse the first range
array[0] = 2;
array[1] = 1;

// (2) reverse the elements between the ranges
array[2] = 5;
array[3] = 4;
array[4] = 3;

// (3) reverse the second range
array[5] = 8;
array[6] = 7;
array[7] = 6;

// (4) finally, reverse the entire array
array[0] = 6;
array[1] = 7;
array[2] = 8;
array[3] = 3;
array[4] = 4;
array[5] = 5;
array[6] = 1;
array[7] = 2;

Спойлер: (сначала сделайте домашнее задание, а затем прочитайте это)

0 голосов
/ 02 сентября 2011

Один из подходов, который вы можете использовать в своем примере, - это поменять местами минимальный диапазон, а затем «всплыть» в последней части.Итак:

array[0] = 1;   --> 6
array[1] = 2;   --> 7
array[2] = 3;
array[3] = 4;
array[4] = 5;
array[5] = 6;   --> 1
array[6] = 7;   --> 2
array[7] = 8;

Затем вы взбиваете восьмерку, переставляя массив [7], с массивом [6], затем массив [6] с массивом [5] и т. Д., Пока вы не поместите 8 вправильное место.Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...