阅读STL源码剖析笔记 —— vector
来源:互联网 发布:守望先锋显卡优化 编辑:程序博客网 时间:2024/05/19 05:06
初步阅读vector 的摘要源码,我找到了一些我觉得挺重要的东西,在STL源码剖析里面,vector 的实现中有这么几个函数:
void push_back(const T& x){ if (finish != end_of_storage) //finish 是我们经常用的end()函数返回的迭代器,end_of_storage 也是一个迭代器,表示可用空间的尾 { construct(finish,x); //这个全局函数作用就是将初值设定到指针所指的空间上 ++finish; } else { insert_aux(end(),x); //这个函数是一个vector里面的成员函数,作用应该是在特定的位置插入元素; }}iterator erase(iterator position) { if (position + 1 != end()) { copy(position + 1, finish, position); } --finish; destroy(finish); //这个全局函数就是将指针所指的东西析构掉; return position;}
1. 从上面的push_back 函数并没有看出vector对空间分配的特性:假如可用空间已满,那么就额外分配出基于当前元素个数的空间以便之后的插入/添加元素的操作
(/*额外分配元素个数依据不同的编译器来确定*//*或者根据代码?*/),我猜想应该是在insert_aux(iterator position)[上面没写出来] 这个函数里面会解决空间的分配,然而摘要源码
里面并没有给出这个函数的实现,只能放一放。
2. 第二个函数:erase,这个函数是我们经常用到的函数之一,是删除迭代器指定位置的元素,有2种重载版本可供我们使用,我就先理解一下只接受一个迭代器的版本吧:
过程 : 判断是否是最后一个元素->所有元素前移一位->末端迭代器自减-> 返回传入函数的迭代器。
我记得,在 《C++ Primer》一书中,作者就警告我们说,erase操作会使迭代器失效,这个函数会返回指向后面一个元素的迭代器,但是在这个函数里面并没有对原本迭代器作任何的改变(因为传进来的不是引用),感觉这个迭代器的副本只是为了记录所指向的位置,而经过copy之后,这个位置正好是原来容器中后面一个元素所占用的位置,然后再把这个指针当作返回值返回,那么可否看作是返回指向后面一个元素的迭代器的假象呢?(求高人指点)
反正感觉弄不懂的话,那么用erase函数的时候记得《C++ Primer》中说的就好 ——返回指向下一个元素的迭代器
3.对vector 的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了
如果有不对的地方,欢迎指正!
- 阅读STL源码剖析笔记 —— vector
- 阅读STL源码剖析笔记 —— 迭代器概念
- 《STL源码剖析》阅读笔记
- STL源码剖析 — — vector
- STL源码剖析——vector
- STL源码剖析——vector
- STL源码剖析——vector
- STL源码剖析——vector
- STL源码剖析:vector学习笔记
- STL源码剖析笔记三vector
- 《stl源码剖析》学习笔记 1.vector
- 《STL源码剖析》阅读笔记1
- 《STL源码剖析》---stl_construct.h阅读笔记
- 《STL源码剖析》---stl_alloc.h阅读笔记
- 《STL源码剖析》---stl_uninitialized阅读笔记
- 《STL源码剖析》---stl_iterator.h阅读笔记
- 《STL源码剖析》---stl_vector.h阅读笔记
- 《STL源码剖析》---stl_list.h阅读笔记
- jQuery validate 插件详解 转载
- dapper 的学习
- Qt5.2.0配置sdk
- c++ tuple类型
- 自定义view的measureSpec是谁的mode和size
- 阅读STL源码剖析笔记 —— vector
- 1012. The Best Rank
- 2-SAT题集
- java--连接数据库--mysql--介绍
- ImageView 的 src 属性
- C语言赋值类型的转换
- 二叉树相关练习题(C++)
- java 递归算法
- JavaScript 触发事件列表