和数组非常相似vector可以动态扩展,但是数组不行指向一片连续的内存动态扩展是找个新的更大的空间来存放数据,而不是在后面接上新空间
迭代器失效的情况:当vector找到新的更大的空间时,以前的迭代器就失效了
构造| 方法 | 作用 |
|---|---|
| vector v; | 采用模板实现类实现,默认构造函数 |
| vector(v.begin() , v.end()) | 将v[begin(),end())区间中的元素拷贝给本身(注意是前闭后开) |
| vector(n, elem) | 构造函数将n个elem拷贝给本身 |
| vector(const vector &vec) | 拷贝构造 |
比较简单,一般使用operator= 和assign都可以
| 方法 | 作用 |
|---|---|
| vector& operator=(const vector &vec) | 重载等号操作符 |
| assign(beg,end); | 将[beg,end]区间中的数据拷贝赋值给本身 |
| assign(n,elem) | 将n个elem拷贝给本身 |
void printfVector(vector容量和大小&Obj) { for (vector ::iterator it = Obj.begin(); it != Obj.end(); it++) { cout << *it << " "; } cout << endl; } void func() { vector v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } printfVector(v1); //赋值方式给1 operator= vector v2; v2 = v1; printfVector(v2); //assign 将[beg,end]区间中的数据拷贝赋值给本身 vector v3; v3.assign(v1.begin(), v1.end()); printfVector(v3); //assign(n, elem) 将n个elem拷贝给本身 vector v4; v4.assign(5,10); printfVector(v4); }
| 方法 | 作用 |
|---|---|
| empty(); | 判断容器是否为空 |
| capacity(); | 容器的容量 |
| size(); | 返回容器中元素的个数 |
| resize(int num); | 重新指定容器的长度为num 若变长,则以默认值填充新的位置, 若变短,则超出容器部分被删除 |
| resize(int num ,elem) | 重新指定容器的长度为num 若变长,则以elem填充新的位置 若变短,则超出容器部分被删除 |
注意:resize改变的是size而不是capacity
void printfVector(vector插入和删除&Obj) { for (vector ::iterator it = Obj.begin(); it != Obj.end(); it++) { cout << *it << " "; } cout << endl; } void func() { vector v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } printfVector(v1); //empty(); 判断容器是否为空 if (v1.empty()) { cout << "vector容器为空 " << endl; } else { cout << "vector容器的容量为 = " << v1.capacity() << endl; cout << "vector容器的大小为 = " << v1.size() << endl << endl; cout << "vector容器的变小后" << endl; v1.resize(5); printfVector(v1); cout << endl; cout << "vector容器的扩大后" << endl; v1.resize(10, 6); printfVector(v1); cout << endl; } }
| 方法 | 作用 |
|---|---|
| push_back(elem); | 尾部插入元素 |
| pop_back(); | 删除最后一个元素 |
| insert(const_iterator pos,elem) | 迭代器指向位置插入元素elem |
| insert(const_iterator pos, int Count, elem) | 迭代器指向位置pos插入count个元素elem |
| erase(const_iterator pos); | 删除迭代器指向的元素 |
| erase(const_iterator start, const_iterator end) | 删除迭代器从start到end之间的元素 |
| clear(); | 删除容器中所有元素 |
void printfVector(vector数据存取&Obj) { if (Obj.size() == 0) { cout << "vector容器为空!"; } for (vector ::iterator it = Obj.begin(); it != Obj.end(); it++) { cout << *it << " "; } cout << endl; } void func() { //尾插法插入元素 vector v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } printfVector(v1); //删除最后一个元素 v1.pop_back(); printfVector(v1); //迭代器指向位置插入元素elem v1.insert(v1.begin(), 6); v1.insert(v1.begin(), 2, 50); printfVector(v1); //删除迭代器指向的元素 v1.erase(v1.begin()); printfVector(v1); vector ::iterator it = v1.begin(); it = it + 2; v1.erase(v1.begin(), it); printfVector(v1); v1.clear(); //清空 printfVector(v1); }
| 方法 | 作用 |
|---|---|
| at(int idx); | 返回索引idx所指的数据 |
| operator[]; | 返回索引idx所指的数据 |
| front(); | 返回容器中第一个数据元素 |
| back() | 返回容器中最后的一个数组元素 |
//用at()访问第i个元素 void printfVector(vector互换容器&Obj) { if (Obj.size() == 0) { cout << "vector容器为空!"; } for (int i= 0;i v1; for (int i = 0; i < 10; i++) { //v1[i] = i; 在此之前是因为容量和大小为0,该语句属于越界访问! v1.push_back(i); } printfVector(v1); cout << " 第一个元素为 = " << v1.front() << endl; cout << "最后一个元素为 = " << v1.back() << endl; }
| 方法 | 作用 |
|---|---|
| swap(vec) | 将vec与本身的元素互换 |
vectorv1; for (int i = 0; i < 10; i++) { v1.push_back(i); } cout << "v1容器为:" << endl; printfVector(v1); vector v2; for (int i = 0; i < 10; i++) { v2.push_back(i*10); } cout << "v2容器为:" << endl; printfVector(v2); //互换容器 cout << "互换后容器后" << endl; v2.swap(v1); cout << "v1容器为:" << endl; printfVector(v1); cout << "v2容器为:" << endl; printfVector(v2);
根据vector的特性,容器的容量是>=容器的大小。如果一个容器原来非常大,但是使用resize之后改变了size但是没有改变capacity,就可以使用交换方法来减少capacity
原理:vector
可分解为:vector
vector
.swap(v1):表示匿名对象和v1进行容器互换,进而减小容器的容量空间
预留空间主要作用:减少vector在动态扩展容量时的开展次数
| 方法 | 作用 |
|---|---|
| reserve(int len) | 容器预留len个元素长度,预留位置不初始化,元素不可访问 (更改容量) |
int* p = NULL; //记录每次的v1首地址 int count = 0; //统计开辟次数 vectorv1; //如果已知要这么大的空间就可以先预留,避免Vector多次开辟 v1.reserve(100005); for (int i = 0; i < 100000; i++) { v1.push_back(i); if (p != &v1[0]) { p = &v1[0]; count++; } } cout << "开辟次数 count = " << count << endl;



