C++:Vector动态数组的copy深入理解

发布于:2024-02-12 ⋅ 阅读:(55) ⋅ 点赞:(0)

     动态数组分配的大小默认为2的n次方1,2,4,8...

    在main中创建的vertices,push需要放到Vertex中(copy),下一次copy是因为要调整vertices的大小

    vertices.push_back(Vertex(1,2,3));//拷贝 第一次,容量为1,拷贝进去,调用一次

    vertices.push_back(Vertex(4,5,6));//拷贝 第二次,容量调整为2(包含了新的数组内容),copy一次,再拷贝旧的容量1到 新的容量为2的数组里面,调用一次 共两次copy

    vertices.push_back(Vertex(7,8,9));//拷贝  第三次,容量调整为4包含了新的数组内容),copy一次,拷贝旧的容量2里面的两次数字,调用两次 共两次copy

    vertices.push_backVertex(10,11,12));//拷贝  第四次,拷贝新的数组到容量4里面去,调用两次 共1次copy

题外话:我觉得理解这个蛮重要的!理解怎么运作才可以优化~

#include <string>
#include <iostream>
#include <vector>

//动态数组的优化

struct Vertex
{
    float x,y,z;//找变量在内存的位置
    
    Vertex(float x,float y,float z)
        :x(x),y(y),z(z)
    {
    }
    
    Vertex(const Vertex& vertex)
        :x(vertex.x),y(vertex.y),z(vertex.z)//每次拷贝一个数组x,y,z
    {
        std::cout<<"copy"<<std::endl;
    }

};

int main()
{
    std::vector<Vertex>vertices;//定义一个动态大小的数组 内存连续
    std::vector<Vertex>vertices2;
    //普通方法
        
    //动态数组分配的大小默认为2的n次方1,2,4,8...
    //在main中创建的vertices,push需要放到Vertex中(copy),下一次copy是因为要调整vertices的大小
    vertices.push_back(Vertex(1,2,3));//拷贝 第一次,容量为1,拷贝进去,调用一次
    vertices.push_back(Vertex(4,5,6));//拷贝 第二次,容量调整为2(包含了新的数组内容),copy一次,再拷贝旧的容量1到 新的容量为2的数组里面,调用一次 共两次copy
    vertices.push_back(Vertex(7,8,9));//拷贝  第三次,容量调整为4包含了新的数组内容),copy一次,拷贝旧的容量2里面的两次数字,调用两次 共两次copy
    vertices.push_back(Vertex(10,11,12));//拷贝  第四次,拷贝新的数组到容量4里面去,调用两次 共1次copy

    std::cout<<"=================="<<std::endl;
    
    //优化
    vertices2.reserve(4);//设置固定容量,四次修改,四次copy  emplace_back直接传递构造函数的参数列表,直接使用vector的内存 而不是main中copy到vertex
    //此时直接使用emplace_back后,直接传递,而不是copy,就不再调用copy了
    vertices2.emplace_back(1,2,3);
    vertices2.emplace_back(4,5,6);
    vertices2.emplace_back(7,8,9);
    vertices2.emplace_back(10,11,12);


    
    std::cin.get();
}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到