Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否在阵列中移动一系列元素而无需额外内存?_C++_Arrays_Memory_Swap - Fatal编程技术网

C++ 是否在阵列中移动一系列元素而无需额外内存?

C++ 是否在阵列中移动一系列元素而无需额外内存?,c++,arrays,memory,swap,C++,Arrays,Memory,Swap,基本上我有这样一个数组:[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:我正在为任何给定数组及其内部的任何范围寻

基本上我有这样一个数组:
[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:我正在为任何给定数组及其内部的任何范围寻找解决方案

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

/**
* 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
}
#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;
}
但正如我所讨论的,使用它时应该非常谨慎(我的观点是,谨慎和记忆增益之间的权衡是不公平的)


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

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;
}
对于另一种方法,使用XOR,检查我的链接或此链接中的注释



另一种通用方法是使用,如图所示。

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

/**
* 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
}
#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;
}
但正如我所讨论的,使用它时应该非常谨慎(我的观点是,谨慎和记忆增益之间的权衡是不公平的)


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

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;
}
对于另一种方法,使用XOR,检查我的链接或此链接中的注释



另一种通用方法是使用,如图所示。

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

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

或者更著名、更快的XOR选项:

void swap(int &a, int &b) {
    b ^= a;
    a ^= b;
    b ^= a;
}
像这样使用:

/**
* 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
}
#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;
}
像这样使用:

/**
* 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
}
#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;
}

先展示你的作品。请给出原型。当你说没有额外的内存时,你会允许for循环有一个索引变量和一个交换变量,还是说“没有任意大的临时空间分配”?这是用于std容器还是用于C数组?首先显示您的工作。请给出原型。当你说没有额外的内存时,你会允许for循环有一个索引变量和一个交换变量,还是说“没有任意大的临时空间分配”?这是一个std容器还是一个C数组?对,从我的链接粘贴的副本,doomista说:“它是防溢出的。但是根据,当使用额外变量时,编译器优化可以产生更快和内存等效的解决方案,所以我想这是目前为止最好的解决方案,当你不在汇编级别工作时。”+一个更快的XOR选项——在前几天看到一个演示,它显示的不是现代C++编译器在交换两个整数时所能产生的速度。“它是防溢出的。但是根据,当使用额外的变量时,编译器优化可以产生更快和内存等效的解决方案,所以我想这是迄今为止在不使用汇编级别时的最佳解决方案。“+1+XOR XOR选项”——前几天看到一个演示,它显示了当两个整数交换时,现代C++编译器可以产生的速度不快。还有针对任意阵列和范围的通用交换解决方案吗?@KaiserJohaan-ah-good point,已更新!有一个使用XOR,但我仍然不建议您使用它,原因仍然是我在文章中陈述的。答案更新!复制覆盖目标编号中的元素?还有针对任意阵列和范围的通用交换解决方案吗?@KaiserJohaan-ah-good point,已更新!有一个使用XOR,但我仍然不建议您使用它,原因仍然是我在文章中陈述的。答案更新!