交换数组

3

是否有一些库函数可以交换两个动态分配数组中的值?
假设我像这样声明和初始化我的数组:

int * a = new int[10];
int * b = new int[5];
for(int i = 0; i < 10; i++){
a[i] = i + 1;   //stores a[10] = {1,2,3,4,5,6,7,8,9,10}
}  
for(int i = 0; i < 5; i++){
b[i] = i + 1;   //stores b[5] = {1,2,3,4,5}
}  
swap(a,b);  

我希望a数组存储:{1, 2, 3, 4, 5}
而数组b应存储:{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}


1
你没有数组,只有指针。这个区别至关重要,因为 std::swap 会交换指针(但不会交换数组)。 - john
除非您使用类似于std::vector并传递引用,否则只需交换指针即可。 - Krzysztof Skowronek
另外,不要忘记删除你的 new[] 指针。 - pandorafalters
我宁愿说,如果不需要使用new,则不要使用它!就像在这个例子中一样。在现代C++中,应尽可能避免自定义内存管理。而且,如果由于某种原因仍然需要使用它,最好将其抽象成一些特殊的类。 - sklott
2个回答

4

你只需要交换指针,可以使用 std::swap 实现。

#include <algorithm>

int main(int argc, char *argv[])
{
    int * a = new int[10];
    int * b = new int[5];
    for (int i = 0; i < 10; i++) {
        a[i] = i + 1;   //stores a[10] = {1,2,3,4,5,6,7,8,9,10}
    }
    for (int i = 0; i < 5; i++) {
        b[i] = i + 1;   //stores b[5] = {1,2,3,4,5}
    }

    std::swap(a, b);
    for (int i = 0; i < 5; i++)
        std::cout << a[i] << " ";
    std::cout << endl;
    for (int i = 0; i < 10; i++)
        std::cout << b[i] << " ";
}

输出:

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

动态分配的内存不会受到影响,唯一改变的是指针 a 和 b 的值。

-1

你只需要改变两个指针的值,因此参数是指针的地址(int **)。

int main(int argc, char *argv[])
{
     int * pA = new int[10];
     int * pB = new int[5];
     if(NULL != pA && NULL != pB)
     {
         for (int i = 0; i < 10; i++)
         {
            a[i] = i + 1;
         }
         for (int i = 0; i < 5; i++) 
         {
             b[i] = i + 1;
         }
         swap(&pA,&pB);
         for (int i = 0; i < 5; i++)
         {
            cout << a[i] << " ";
         }
         cout << endl;
         for (int i = 0; i < 5; i++) 
         {
            cout << b[i] << " ";
         }
     }
 }

 void swap(int**pA, int **pB)
 {
     int *pTemp = *pA;
     *pA = *pB;
     *pB = pTemp;
 }

这是C和C++的混合体。特别地,它忽略了std::swap并且在其::swap实现中忽略了引用。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接