• C/C++ 数组复制


    分几种情况:

    1.字符数组

    使用strcpy

    2.int,float,double等数组

    使用memcpy,如复制一个长度为5 的 float数组,则代码示例如下

    int len = 5;

    float a[len] = {1.0 ,1.1, 1.2, 1.3, 1.4};

    float b[len];

    memset(b, 0, len*sizeof(float));

    memcpy(b, a, len * sizeof(float));

    注意,第三个参数不是指数组个数,而是指要复制的数据的总字节数长度。

    3.对象数组

    不能使用以上两种,需要实现拷贝构造函数或赋值重载函数。

    C++ 风格的复制操作
    使用STL中的copy算法
    int a[] = {1,2,3,4,5};
    int b[5];
    std::copy(std::begin(a),std::end(a),std::begin(b));
    for(auto e:b) cout<<e<<" ";     // 输出 1,2,3,4,5
    上述程序中,copy算法将数组a区间中的数复制到以begin(b)开始的区间中去.

    使用array容器 (C++11)
    std::array<int,5> arr = {1,2,3,4,5};
    std::array<int,5> copy;
    copy = arr;      // 将arr中的元素复制到copy中
    arr[0] = 100;
    for(auto e:copy) cout<<e<<" ";      //输出 1,2,3,4,5


    C 风格的复制操作
    使用memcpy()
    int arr[] = {1,2,3,4,5};
    int copy[5];
    int len = sizeof(arr) / sizeof(arr[0]);
    memcpy(copy,arr,len*sizeof(int));   // 输出 1,2,3,4,5
    for(auto e:copy) cout<<e<<" ";
    注意:memcpy()函数的第三个参数表示的是要复制的字节数,而不是要复制的元素数目。至于这样做的原因,可以先来看memcpy()的原型:
    void* memcpy(void* destination,const void* source,size_t num);

    由memcpy()的函数原型可以看到,该函数的前两个参数的类型是void*类型,这样做是为了使memcpy()可以作用于任何类型的指针。

    但这样做又导致了一个问题,即memcpy()不知道传入数组的每个元素用多少字节来表示。也正是因为这个原因,使得memcpy()的第三个参数不能是要复制的元素个数,而是要复制的字节数。

    使用memmove()
    该函数与memcpy()类似,只是memmove允许目的位置和源位置重叠,示例如下:

    int arr[] = {1,2,3,4,5,6,7,8};
    memmove(arr+3,arr+1,sizeof(int)*5);
    for(auto e:arr) cout<<e<<" ";       // 输出 1,2,3,2,3,4,5,6
    注意:上面的程序中,如果将memmove()换作memcpy()可能也会正常工作,但是这种行为是不可预计的,当目的位置与源位置存在重叠时,应当使用memmove()。

    测试实例
    #include <iostream>
     
    using namespace std;
    int main()
    {
        int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        int b[10] = { 0 };
        int c[10] = { 0 };
        //copy
        copy(begin(a), end(a), begin(b));
        for (auto i : b)
            cout << i << " ";
        cout << endl;
        //memcpy
        memcpy(c, a, sizeof(a));
        for (auto i : c)
            cout << i << " ";
        cout << endl;
        //memmove 
        int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
        memmove(arr + 3, arr + 1, sizeof(int)* 5);
        for (auto e : arr) 
            cout << e << " ";
        cout << endl;
        system("pause");
        return 0;
    }
    运行结果:

  • 相关阅读:
    调度器27—Freq Qos 和 限频流程 Hello
    调度器23—EAS Hello
    调度器24—CFS任务选核 Hello
    调度器22—CPU频点设置函数分析 Hello
    attribute section 属性 Hello
    使用二级指针辅助遍历的单链表 Hello
    数据结构——TODO Hello
    plist移植学习笔记 Hello
    Linux驱动中继承与多态思想_C Hello
    内核线程 Hello
  • 原文地址:https://www.cnblogs.com/lidabo/p/15883783.html
Copyright © 2020-2023  润新知