C++学习笔记 17 Vector

一、vector三种遍历方式

  1. fori
  2. for
  3. iterator

二、遍历及调用注意事项

引用传递避免复制

三、reserve(size) 指定size,避免resize

四、emplace_back 替代 push_back, 避免copy

#include<iostream>
#include<vector>

struct Vertex {
	int x, y, z;

	Vertex(int x, int y, int z): x(x), y(y), z(z) {
		std::cout << "Vertex Constructor" << std::endl;
	}

	Vertex(const Vertex& vertex): x(vertex.x), y(vertex.y), z(vertex.z) {
		std::cout << "Vertex copied" << std::endl;
	}
};

//重定义输出 Vertex 数据
std::ostream& operator<<(std::ostream& stream, const Vertex& tex) {
	stream << tex.x << " , " << tex.y << " , " << tex.z;
	return stream;
}

//参数要用引用方式设置,否则会复制
void Funtion(const std::vector<Vertex>& vertex) {

}

void testVector() {
	//在testVector()方法栈帧中创建vector对象
	std::vector<Vertex> dynamicArr;
	//reserve: 保留,留出;拥有;留存,储备;预订,预约
	dynamicArr.reserve(3);
	dynamicArr.push_back({ 1, 2, 3 }); //在testVector()方法栈帧中创建Vertex对象,然后将此对象copy到 vector中
	dynamicArr.push_back({ 4, 5, 6 }); //在testVector()方法栈帧中创建Vertex对象
	dynamicArr.push_back({ 7, 8, 9 }); //在testVector()方法栈帧中创建Vertex对象

	//如果不reserve设置元素个数
	//则有3次resize:
	//default size:1, copy first element to vector memory
	//resize:1 ---> 2, copy first element to new vector memory, copy second to new memory
	//resize:2 ---> 3, copy first and second element to new vector menory, copy third to new memory
	//所以,为了性能,在创建vector时制定元素个数非常有比要,避免无异议的copy折损性能


	//emplace: v.安放;安置就位;放列;使(火炮)进入阵地;
	// 从 C++11 起标准加入了一系列 emplace 相关的函数,来进行数据的 原位构造 。
	//https://zhuanlan.zhihu.com/p/691242577
	//传递构造函数的参数,告诉vector,在实际的vector内存中,用以下参数,构建一个泛型对象
	dynamicArr.emplace_back(1, 2, 3);
	dynamicArr.emplace_back(4, 5, 6);
	dynamicArr.emplace_back(7, 8, 9);

	for (int i = 0; i < dynamicArr.size(); i++) {
		std::cout << dynamicArr[i] << std::endl;
	}

	dynamicArr.erase(dynamicArr.begin() + 1);

	std::cout << " -------------- " << std::endl;

	//此处要用引用,否则会复制
	for (Vertex& vertex : dynamicArr) {
		std::cout << vertex << std::endl;
	}
}

int main() {
	testVector();
	std::cin.get();
}
posted @ 2025-12-11 10:20  超轶绝尘  阅读(2)  评论(0)    收藏  举报