#include <iostream>
#include <vector>
struct Vertex
{
float x, y, z;
Vertex(float x,float y, float z)
{
this->x = x;
this->y = y;
this->z = z;
}
};
std::ostream& operator<< (std::ostream& stream, const Vertex& vertex)
{
stream << vertex.x << vertex.y << vertex.z;
return stream;
}
int main()
{
std::vector<Vertex> vertices;
vertices.push_back(Vertex(1.3f, 2.1f, 4.4f));
vertices.push_back({ 2,3,4 });
//两种方式便利vertor
//for (int i = 0; i < vertices.size(); i++)
//{
//std::cout << vertices[i] << std::endl;
//}
for (Vertex &ver:vertices) //传入引用的原因时为了尽量减少复制,如果不是引用,则会将每个vertices复制到for循环中,影响性能
{
std::cout << ver << std::endl;
}
vertices.erase(vertices.begin() + 1); //删除vertices中的第二个元素。因为erase中的参数时一个iterator
vertices.clear(); //清空整个vertices中的元素
std::cin.get();
return 0;
}
下面简单对vector进行优化
vector影响性能的主要原因是当插入新的元素是,原来的vector分配的剩余内存不够时,需要复制原来vector中存在的所有元素,重新分配内存,从而影响程序的性能。
#include <iostream>
#include <vector>
struct Vertex
{
float x, y, z;
Vertex(float x,float y, float z)
{
this->x = x;
this->y = y;
this->z = z;
}
//新增一个拷贝构造函数,查看复制操作的产生时机
Vertex(const Vertex& ver)
:x(ver.x),y(ver.y),z(ver.z)
{
std::cout << "进行一次复制操作!!!" << std::endl;
}
};
std::ostream& operator<< (std::ostream& stream, const Vertex& vertex)
{
stream << vertex.x << ", " << vertex.y<< ", " << vertex.z;
return stream;
}
int main()
{
std::vector<Vertex> vertices;
vertices.push_back(Vertex(1.3f, 2.1f, 4.4f));
vertices.push_back({ 2,3,4 });
//这个状态下执行三次复制操作
std::cin.get();
return 0;
}
运行结果
???????
#include <iostream>
#include <vector>
struct Vertex
{
float x, y, z;
Vertex(float x,float y, float z)
{
this->x = x;
this->y = y;
this->z = z;
}
//新增一个拷贝构造函数,查看复制操作的产生时机
Vertex(const Vertex& ver)
:x(ver.x),y(ver.y),z(ver.z)
{
std::cout << "进行一次复制操作!!!" << std::endl;
}
};
std::ostream& operator<< (std::ostream& stream, const Vertex& vertex)
{
stream << vertex.x << ", " << vertex.y<< ", " << vertex.z;
return stream;
}
int main()
{
std::vector<Vertex> vertices;
vertices.reserve(3);
//vertices.push_back(Vertex(1.3f, 2.1f, 4.4f));
//vertices.push_back({ 2,3,4 });
//vertices.push_back(Vertex(3, 4, 5));
//提前reserve后,这个状态下执行三次复制操作,是因为push_back操作,每次先在main函数的栈帧创建一个Vertex,然后再将main中创建好的Vertex复制到vertices分配好的内存中
vertices.emplace_back(1.3f, 2.1f, 4.4f);
vertices.emplace_back( 2,3,4 );
vertices.emplace_back(3, 4, 5);
//使用emplace_back替换push_back,这个状态下不会执行复制操作,因为push_back是用参数的数据在vertices分配好的内存中创建Vertex对象,不需要再去复制
std::cin.get();
return 0;
}