繁体   English   中英

移动数组中的一系列元素而无需额外的内存?

[英]Move a range of elements within array without extra memory?

本质上,我有一个像这样的数组: [1, 2, 3, 9, 9, 4, 5, 6, 7]

我要移动的[1, 2, 3]前部[4, 5, 6, 7]所示: [9, 9, 1, 2, 3, 4, 5, 6, 7]同时该保留的顺序其余阵列。

一种简单的方法是在我将数组的其余部分向左移动时分配一个临时数组以适合[1, 2, 3] ,但是我想做到这一点而不消耗任何额外的内存。 这可能吗? 也许一些交换技术?

编辑:澄清一下,这是一个大型STL数组,通过额外的内存,我的意思是没有额外的大堆分配,临时变量就可以了。

EDIT2:我正在寻找任何给定数组及其内部任何范围的解决方案

使用std :: rotate ,像这样:

#include <iostream>
#include <algorithm>

int main () {
    std::vector<int> v = {1, 2, 3, 9, 9, 4, 5, 6, 7};
    for (auto i : v) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
    std::rotate(v.begin (), v.begin () + 3, v.begin () + 5);
    for (auto i : v) {
        std::cout << i << " ";  
    }
    std::cout << std::endl;
}

输出:

1 2 3 9 9 4 5 6 7 
9 9 1 2 3 4 5 6 7 

您想要交换两个数字,而不使用临时的,这是可能的,如下所示:

/**
* Swap the parameters without a temp variable.
* Warning! Susceptible to overflow/underflow.
* @param a The first parameter.
* @param a The second parameter.
*/
void swapNoTemp(int& a, int& b)
{
    a -= b;
    b += a;// b gets the original value of a
    a = (b - a);// a gets the original value of b
}

但是,正如我在这里讨论的那样,应格外谨慎地使用它(我的观点是,谨慎与获得的记忆增益之间的权衡是不公平的)。


使用此功能的主要功能示例:

int main()
{
    int a[] = {1, 2, 3, 9, 9, 4, 5, 6, 7};
    swapNoTemp(a[0], a[2]);
    swapNoTemp(a[0], a[4]);
    swapNoTemp(a[1], a[3]);
    for(int i = 0; i < 9; ++i)
        std::cout << a[i] << " ";
    std::cout << std::endl;
    return 0;
}

输出:

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
9 9 1 2 3 4 5 6 7 

对于使用XOR的另一种方法,请检查我的链接或此答案中的注释。


另一个通用方法是使用std :: rotate ,如本答案所示。

或更著名,更快的XOR选项:

void swap(int &a, int &b) {
    b ^= a;
    a ^= b;
    b ^= a;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM