Vector4 的理解

在写一个Vertex结构的时候,不知道位置Pos,用Vector3,还是用Vector4比较好,最后选择,用Vector4.

原因:

1. 点,用Vector4表示就是(x,y,z,1)。

2. 向量,用Vector4表示就是(x,y,z,0)。

那么,向量是两个点相减组成,得到,(x1,y1,z1,1)- (x2,y2,z2,1) = (x1 - x2, y1 - y2,z1 - z2,0),就可以表示两个点相减是一个向量。

如果用Vector3表示一个点的话,就不知道两个点相减是什么了。


<think>好的,用户之前问了如何学习STL来应对蓝桥杯,现在又问“vector怎么理解”。我需要详细解释vector的概念和用法,但要注意用户可能已经有了一些基础,或者在之前的回答中已经提到了vector的重要性。 首先,用户可能是在学习过程中遇到了vector,需要更深入的理解。他们可能已经知道vector是动态数组,但需要更系统化的知识,比如内部实现、常用操作、注意事项等。 接下来,我要考虑用户的需求。他们可能希望了解vector的基本概念、常用方法,以及在算法竞赛中的实际应用。同时,用户可能对性能问题(如时间复杂度)和常见错误(如迭代器失效)感兴趣,因为这些在比赛中很关键。 需要组织内容的结构。先从基本定义开始,说明vector的作用和优点。然后比较vector和普通数组的区别,突出其动态扩容的特性。接着讲解常用操作,包括初始化、增删改查、遍历等,最好用代码示例说明。然后讨论性能问题,比如不同操作的时间复杂度,以及扩容机制。还要提到注意事项,比如迭代器失效的情况,如何避免,以及常见的使用技巧,比如预分配空间来优化性能。 用户可能还有更深层的需求,比如如何高效使用vector来解决算法题,或者如何避免常见的错误导致失分。因此,实际应用场景的例子会有帮助,比如在BFS中使用vector作为邻接表,或者处理动态数组时的排序和查找。 最后,总结一下vector的重要性,并鼓励用户多练习,结合之前的STL学习路径,巩固知识。可能还需要提醒用户参考之前提到的资源,比如刷题平台和书籍,来加强学习效果。</think>在 C++ 中,`vector` 是最重要且最常用的 **动态数组容器**,可以理解为会自动扩容的智能数组。它在算法竞赛和实际开发中几乎无处不在,下面用程序员最易懂的方式分层解析: --- ### **一、底层本质** - **物理结构**:连续内存空间(类似普通数组) - **核心特性**:动态扩容(容量不足时自动申请更大内存并拷贝数据) - **时间复杂度**: - 随机访问:`O(1)`(支持 `v[i]` 直接访问) - 尾部插入/删除:均摊 `O(1)` - 中间插入/删除:`O(n)`(需要移动后续元素) --- ### **二、与普通数组的对比** | **特性** | 普通数组 `int arr[10]` | `vector<int> v` | |--|-------------------------------| | 内存管理 | 手动分配/释放 | 自动管理 | | 大小固定 | 编译时确定 | 运行时动态变化 | | 越界访问 | 不检查(可能崩溃) | `v.at(i)` 会抛异常(更安全) | | 功能扩展 | 无 | 自带排序、查找等算法支持 | --- ### **三、核心操作速查** #### 1. 初始化 ```cpp vector<int> v1; // 空vector vector<int> v2(5, 100); // 5个100 → {100,100,100,100,100} vector<int> v3 = {2,4,6,8}; // 列表初始化(C++11) ``` #### 2. 增删改查 ```cpp v.push_back(10); // 尾部插入 → O(1) v.pop_back(); // 尾部删除 → O(1) v.insert(v.begin()+2, 20); // 在索引2处插入 → O(n) v.erase(v.begin()+1); // 删除索引1元素 → O(n) v[3] = 50; // 直接修改 → 类似数组(不检查越界!) v.at(3) = 50; // 会检查越界的访问 ``` #### 3. 容量控制 ```cpp v.reserve(100); // 预分配容量(避免频繁扩容)★ 性能关键! v.resize(10); // 强制修改大小为10(多删少补默认值) v.shrink_to_fit(); // 释放多余容量(C++11) ``` #### 4. 信息获取 ```cpp int size = v.size(); // 实际元素个数 int cap = v.capacity(); // 当前总容量(≥size) bool isEmpty = v.empty();// 判空 ``` --- ### **四、性能优化技巧** #### 1. **预分配空间**(避免反复扩容) ```cpp vector<int> v; v.reserve(1000); // 提前预留空间 → 减少扩容时的拷贝开销 for(int i=0; i<1000; i++) v.push_back(i); ``` #### 2. **巧用 swap 释放内存** ```cpp vector<int> v(1000000); v.clear(); // 清空元素,但容量不变(内存未释放) vector<int>().swap(v); // 强制释放内存(容量变为0) ``` #### 3. **移动语义(C++11)** ```cpp vector<string> createBigData() { vector<string> tmp(1000000); return tmp; // 通过移动而非拷贝返回(效率飞跃) } ``` --- ### **五、算法竞赛经典用法** #### 1. 邻接表存图(替代链表) ```cpp vector<vector<int>> graph(N); // 每个节点的邻接点列表 // 添加边 a→b graph[a].push_back(b); ``` #### 2. 动态二维数组 ```cpp vector<vector<int>> matrix(m, vector<int>(n)); // m行n列 ``` #### 3. 配合算法使用 ```cpp sort(v.begin(), v.end()); // 排序 auto it = lower_bound(v.begin(), v.end(), x); // 二分查找 reverse(v.begin(), v.end()); // 反转 ``` -- ### **六、避坑指南** 1. **迭代器失效** ```cpp vector<int> v = {1,2,3}; auto it = v.begin(); v.push_back(4); // 可能导致迭代器失效! // 正确做法:操作后重新获取迭代器 ``` 2. **越界访问** ```cpp vector<int> v(3); cout << v[5]; // 未定义行为(可能崩溃) cout << v.at(5); // 抛出 std::out_of_range 异常 ``` 3. **效率陷阱** ```cpp // 错误示范:频繁头部插入 for(int i=0; i<10000; i++) v.insert(v.begin(), i); // O(n²) 时间! // 改用 deque 更高效 ``` --- ### **七、一句话总结** **vector = 数组的便捷性 + 链表的动态性 + 智能的内存管理**,是算法竞赛中存储动态数据的首选容器。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值