今天我们不直接上代码了,我们先来分析一下vector这个容器。 我们来看看这个东西 vector<vector> 这我们可以大概猜到是一个二维数组。 但并不完全是,二维数组是一个n*n 的矩形结构,而这里的vector套vector可不是这样, 我们来剖析一下它 
 当我们执行 vv [ i] [ j ] 这行代码时 首先执行 vv. operator [ i ],也就是vv [ i ] 这时候我们在一个大vector中找到了,很多很多的vector。每一个vector 是用i 控制的,一般用来控制矩形中行的信息。 这时候我们需要访问具体的int,它们存在每个小vector中,那就执行这样的代码 vv [ i ] .operator [ j ] ,这也就等价于 vv [ i ][ j ] 至此我们理解了双v的底层逻辑。 有人会问,为什么不直接用二维数组呢?这个问题很简单,我们的双V什么数据类型都可以存放,而且空间非常的灵活。数组能存什么呢?你不得使用数组指针之类的复杂概念。 那你又说了,这个东西调用来调用去,效率坑定没有数组直接开的快啊, 真是不好意思,我们函数也是有inline 的,展开后并没有什么差别的呦。
我们在上代码之前,再来看看stl源码中是如何组织整个vector的。  有了这个图,再看看他们的成员函数和变量就大概懂了,我的能力暂时无法完整的实现stl源码。 所以这里的vector模拟实现,只是简易版的。 接下来就直接上代码了,具体需要解释的地方,我会在代码中解释。
|