Cpp_vector_Optimizing the usage of std::vector(vector的优化)

Posted yekko

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cpp_vector_Optimizing the usage of std::vector(vector的优化)相关的知识,希望对你有一定的参考价值。

vector optimizing

本文是看了Youtube上Cherno老师的操作来写的总结

学过Cpp11的人应该都对于vector容器不陌生,但是我们在使用它的时候,是不是忽略一些什么?
因为它是c++11新添加的容器,我们就理所当然的认为它的速度是很快的,但是,我们没有意识到它其实在某些方面拖慢了整个程序,例如以下例子

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)
    {
        std::cout << "Copied!" << std::endl;
    }
};

int main()
{
    std::vector<Vertex> vertices;


    vertices.push_back(Vertex({ 1,2,3 }));
    vertices.push_back(Vertex({ 4,5,6 }));
    vertices.push_back(Vertex({ 7,8,9 }));

    std::cin.get();
}

在main函数三句push_back中,我们使用了vertex的构造函数并且我们又将其放入到了vector当中那我们先按照以往的经验,拷贝构造函数应该调用多少次,按照以前的经验应该是三次,因为总共有三次初始化,但是实际上呢,却是六次。这是为什么呢?
技术图片

这其实是因为vector的空间增长机制,每当空间不够时,就会在空间重新开辟一次,并且再复制过去,这样的过程中,就是进行了多三次的拷贝。
那么我们消除这三次就应该,使用vector.reserve()预留一片空间,那么就不会出现这种问题。
优化到这里,肯定以为结束了,结果Cherno老师在这基础上加了一种emplace_back的方法,使其不用调用拷贝构造,而是就地构造,更快的放入。

以上是关于Cpp_vector_Optimizing the usage of std::vector(vector的优化)的主要内容,如果未能解决你的问题,请参考以下文章