vector初始化

来源:互联网 发布:ibatis源码分析 编辑:程序博客网 时间:2024/06/11 16:33

简介:
vector可用于替代C中的数组,或者MFC中的CArray,从许多说明文档或者网上评论,一般一致认为应该优先选择vector,因为它的效率更高,而且具备很好的异常安全性。
而且vector是STL推荐使用的默认容器,除非有特殊需要,如需要容器在head和tail高效的插入和删除,或者在任何位置高效的插入和删除,那么此时使用vector不能满足需求,可能使用deque或者list更加合适。

内存申请:
vector是连续内存容器,也就是说,标准要求所有标准库实现的时候,vector中的元素的内存必须是连续的。所以,对于插入和删除的时间复杂度是很高的,因为插入或删除的时候需要元素的移动,即元素复制拷贝。

vector的初始化:

1. 基本初始化

//Format 1: vector<T> v(n,i) //v包含n个值为i的元素vector<int> ivec(10, 2);//Format 2: vector<T> v(v1) //v1是v的一个副本vector<int> ivec1(ivec);//Format 3: vector<T> v(n) //v包含n个值初始化的元素vector<int> ivec2(10); //10个元素,每个都初始化为0vector<string> svec(10); //10个元素,每个都初始化为空string//Format 4: 用back_inserter函数vector<int> ivec4; //空对象fill_n(back_inserter(ivec4), 10, 3); //10个3,填充ivec4 

2. 填充vector
vector的赋值并不可以像数组一样方便的用花括号方便的完成赋值, 這里借用了数组来初始化这个vector,用原始数组的内容填充vector。
例如我们有数组

 int v1[10] = {0,1,0,0,3,0,0,4,4,4};

初始化方式1(这种方式最为习惯):

//Format : vector<T> intvec(begin, end);vector<int> ivector(v1, v1+10);

初始化方式2:

vector<int> v2(10);//初始化size为10可以避免数组动态增长的时候不断分配内存//v2.reserve(10);  //同上,只要使用其中一个就可以了for (int i=0; i<10; i++){    v2.push_back(v1[i]);//增加一个元素}

初始化方式3:

vector<int> v3(&v1[0], &v1[9]);//原始数组的元素指针可以作为迭代器来使用

初始化方式4:

vector<int> v4;v4.reserve(10);v4.insert(v4.begin(), &v1[0], &v1[9]);

初始化方式5:

vector<int> v5(10);copy(v5.begin(), &v1[0], &v1[9]);

Note:
原始数组的元素指针可以作为迭代器来使用。

原则:尽量使用reserve来减少不必要的内存分配次数。
原则:尽量使用empty而不是size()==0来判断容器是否为空。

reference :
1. http://www.cnblogs.com/freeopen/p/5482962.html
2. https://www.cplusplus.me/1112.html

0 0
原创粉丝点击