【问题标题】:Swapping arrays交换数组
【发布时间】:2019-07-03 06:47:39
【问题描述】:

是否有一些library fucntion 可以交换两个动态分配的数组中的值。
假设我声明并初始化我的数组,如:

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}

【问题讨论】:

  • 你没有数组,你有指针。区别很重要,因为std::swap 将交换指针(但不会交换数组)。
  • 除非你使用 std::vector 之类的东西并传递引用,否则你只需要交换指针
  • 另外,不要忘记delete[] 你的new[] 指针。
  • 我宁愿说,如果你不需要,不要使用new!就像在这个例子中一样。在现代 C++ 中,应尽可能避免自定义内存管理。如果由于某种原因,您仍然需要使用它,最好将它抽象到某个特殊的类中。

标签: c++ arrays swap


【解决方案1】:

您需要做的就是交换指针。您可以为此使用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

动态分配的内存不会以这种方式被触及,唯一​​改变的是指针ab的值。

【讨论】:

    【解决方案2】:

    你只需要改变两个指针的值,所以参数是指针的地址(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 实现中的引用。
    猜你喜欢
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2010-10-26
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多