在C ++中交换数组的各个部分

时间:2011-09-02 12:17:58

标签: c++ arrays pointers

是否有一种简单的方法可以互相交换数组的部分(块)?也就是说,我有一个数组:

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确定的值范围与StartYendY的范围进行交换,因此从我的例子......

如果x range = 2startX = 0以及y range = 3startY = 5,它会将数组[0]和数组[1]放到数组[5]和数组[6]中]是,然后在数组[6]之后放置数组[7],将其他所有内容向下推。我不知道如何解决这个问题,而且我正在将内存复制到临时数组中,但我认为有更好的方法可以做到这一点。 (顺便说一下,我的例子的最终结果是):

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 个答案:

答案 0 :(得分:2)

在可读性和工作量方面交换数组部分的最简单方法是使用标准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';
}

测试:https://ideone.com/ZVv2M

...但它只会交换相等长度的子范围,而不是测试用例中的不等长度。您的案例实际上是swap_ranges()rotate()的组合。

答案 1 :(得分:1)

您可能希望查看valarray及其片段。

答案 2 :(得分:0)

您可以在示例中采用的一种方法是交换最小范围,然后“冒泡”最后一部分。所以:

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,直到你把8放在正确的位置。希望这能让你开始。

答案 3 :(得分:0)

假设你有(或可以创建)一个函数来反转一系列元素,比如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;

剧透:(先做好你的作业再看看)

  

如果您被允许使用标准库,std::reverse中的<algorithm>功能会使这一点变得微不足道。