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的方法,使其不用调用拷贝构造,而是就地构造,更快的放入。

posted @ 2020-03-15 17:22  Yekko  阅读(122)  评论(0编辑  收藏  举报