96SEO 2026-02-20 06:03 18
vector实现时最难想的是赋值重载时的现代写法很妙最有趣的是两种迭代器的失效问题。

与数组相同但又多少有点不同。
vector是一个序列式容器其中的元素都可序ordered但是未必有序sorted本质上是可变数组尾插尾删效率较高。
源代码中vector的实现使用到了alloc空间配置器但是鉴于自身技术水平个人只在本文中阐述如何实现无alloc版本的vector。
因为vector是一段连续的物理存储空间实现增删查改时需要对位置进行、--、、-、、-、-这些都是普通指针就具备的能力所以vector提供的是Random
vector是一段连续的物理空间其中SGI版本使用了三个指针去管理这个变长数组、使用了两个unsigned
与之前学习数据结构实现的动态顺序表内存管理其实大同小异一开始有一块默认大小的内存
_endOfStorage){reserve((capacity()
原stl给出的模板中insert()是返回了一个迭代器指向插入元素的位置。
目的若迭代器已经失效尽管在增容操作中更新迭代器的值进行规避风险但是调用时的迭代器仍为野指针失效状态若后续操作需要使用插入元素位置那就会在此出现问题所以可以再用这个迭代器接受insert()的返回值来进行更新。
①使用一块新的、够大的tmp空间去拷贝原来_start指向的数据
但是此时传进来的、想要插入数据的迭代器仍然指向原来的_start空间这个迭代器就变成了野指针再下一步对这个迭代器指向位置进行操作时就会非法访问所以需要在进行扩容操作是对于迭代器也进行相应的更新尽量避免失效问题。
原stl给出的模板中erase()是返回了一个迭代器指向删除元素的位置的下一个位置。
A因为删除操作本质上是对数据的覆盖这样一来从操作位置开始向后的数据向前挪动也相当于操作位置向后移动了一位指向了下一个位置。
erase()的迭代器失效主要是因为迭代器的意义改变当然也有野指针的问题。
①意义改变当数据向前挪动时这个迭代器已经不再是我们想要的迭代器了他一次性向后跳了两个位置。
②野指针当数据向前挪动时迭代器可能跳过了_finish当第一次与_finish相遇时begin的操作还在继续进行从而继续向后移动宛如脱缰野马永远不可能再停下与_finish相遇才会结束。
改变的是容器的容量需要进行开辟空间、释放空间、拷贝数据的操作效率不是很高也正因为扩容的效率不高所以才有了_endofStorage和_finish去标识容量与元素个数。
valueType[newCapacity]();size_t
因为memcpy()进行的是位操作如果copy的是内置类型int、char等那么直接使用memcpy()会效率很高很方便但是牵扯到指针这会导致内存错误
当两个指针的内容相同那就意味着它们指向了同一块空间如果一个指针释放另一个指针仍对其进行操作就会使得内存发生错误。
valueType[newCapacity]();size_t
①如果newSize比size小那么就发生了删除直接改变_finish即可但是不缩容以防后续操作频繁删除增容、频繁向操作系统申请、释放内存造成抖动。
长增长并初始化else{reserve(newSize);while
obj.capacity();//memcpy(_start,
使用tmp变量让其使用构造函数构造出我们想要copy的对象然后将tmp和我们将要copy的对象进行交换从而帮助我们实现copy构造。
*this)这一点就是将*this中的垃圾扔给了tmptmp还把自己有用的数据全部交给了*this就好比是外卖员替你送了外卖还得帮你扔垃圾。
但是很明显的是已有的构造函数并不能根据传进来的obj对tmp进行构造。
我们需要重载实现一个支持用迭代器区间的copy构造函数stl本来也支持这样的方式构造。
见下一点
现代写法//类模板的成员函数也可以变成函数模板vector(const
obj):_start(nullptr),_finish(nullptr),_endOfStorage(nullptr){vectorvalueType
其他的迭代器string、int、char等都可以通过迭代器去构造。
InputIteratorvector(InputIterator
last){this-push_back(*first);first;}}
析构是释放空间因为三个指针指向的是同一段空间所以只需要释放_start。
size就是_finish与_start之间的距离使用两个指针相减即可得到。
ps但是需要注意的是这两个成员函数最好实现为const成员函数因为在copy构造与的default构造时传的参数均使用了const。
常对象与非常对象都可以用const
必须是begin与end同名才能使用范围foriterator
②copy构造是相对于一个即将创建一个已经存在的对象之间的操作。
与copy构造相同的是它也要实现释放旧空间、开辟新空间、拷贝数据。
(valueType*)calloc(obj.capacity(),
valueType[obj.capacity()];_finish
(valueType*)calloc(obj.capacity(),
valueType[obj.capacity()];_finish
obj.capacity();//memcpy(_start,
这种写法很巧妙地使用了传值传参需要进行拷贝构造的特点利用这一点在传参的时候就可以深拷贝出来一个obj这样进行交换的时候就不会把原来的obj更改。
_finish);std::swap(tmp._endOfStorage,
vector的实现是对于stl源码的一次深入理解但是仍然没有学会alloc只学习了一部分自己模拟实现vector不在于造一个更好的轮子但是可以帮助我更好的了解它、使用它。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback