C/C++教程

std::vector源码剖析

本文主要是介绍std::vector源码剖析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

vector 迭代器

template <class T, class Alloc = alloc>
class vector {
public:
  typedef T value_type;
  typedef value_type* iterator;  //vector 的迭代器是普通指针
...
};

所以根据上述定义,如果客户端写出这样子的代码
vector<int>::iterator ivite;
vector<Shape>::iterator svite;
ivite的类型其实就是int*,svite的类型其实就是Shape*。

vector的数据结构

vector 所采用的数据结构非常简单:线性连续空间。它以两个迭代器 start和 finish 分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage 指向整块连续空间(含备用空间)的尾端:

template ‹class T, class Alloc = alloc>
class vector {
...
protected:
    iterator start;          // 表示目前使用空间的头
    iterator end;            // 表示目前使用空间的尾
    iterator end_of_storage; // 表示目前可用空间的尾
...
};

为了降低空间配置时的速度成本,vector 实际配置的大小可能比客户端需求量更大一些,以备将来可能的扩充。这便是容量(capacity)的观念。换句话说,一个vector 的容量永远大于或等于其大小。一旦容量等于大小,便是满载,下次再有新增元素,整个 vector 就得另觅居所。
在这里插入图片描述
也就是说将原来的内容拷贝过来。通过如果是内置数据类型,那么就是简单执行了memmove

inline char* uninitialized_copy(const char* first, const char* last,
                                char* result) {
  memmove(result, first, last - first);
  return result + (last - first);
}

如果非内置的数据类型则要把旧内存块的对象的值通过拷贝构造函数拷贝到新的内存块上来。

template <class InputIterator, class ForwardIterator>
ForwardIterator 
__uninitialized_copy_aux(InputIterator first, InputIterator last,
                         ForwardIterator result,
                         __false_type) {
  ForwardIterator cur = result;
  __STL_TRY {
    for ( ; first != last; ++first, ++cur)
      construct(&*cur, *first);
    return cur;
  }
  __STL_UNWIND(destroy(result, cur));
}

补充:
resize(int n):重新申请并改变当前vector对象的有效空间大小
reserve(int n):重新申请并改变当前vector对象的总空间(capacity)

1、vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector类型的每一种都指定了其保存元素的类型。因此,vector和vector都是数据类型。
而vector::iterator,vector相当于iterator的命名空间,vector::iterator ivite 转换后就是int* vite

struct MyObj
{
    typedef int WORD32;
};

int main()
{
    MyObj::WORD32 a = 10;
    cout << a << endl;
    return 0;
}

2、vector() 则是一个临时的对象。

这篇关于std::vector源码剖析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!