C++学习笔记 17 Vector
一、vector三种遍历方式
- fori
- for
- 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();
}

浙公网安备 33010602011771号