Vector又称为单端数组,与数组不同的是,vector可以动态扩展。
动态扩展并不是在原有空间中续接新空间,而是寻找更大的空间,然后将原数据拷贝到新空间,释放原空间。

Vector<T> v; //采用模板实现,默认构造函数
Vector(v.begin(),v.end()); //将v[gegin(),end()]区间中的元素拷贝给本身
Vector(n,elem); //将n个elem拷贝给本身
Vector(const vector& vec); //拷贝构造函数
- #include<iostream>
- #include<vector>
- using namespace std;
- void printVector(vector<int>& v)
- {
- for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
- void test01()
- {
- vector<int> v1; //默认构造,无参构造
- for (int i = 0; i < 10; i++)
- {
- v1.push_back(i);
- }
- printVector(v1);
-
- //通过区间方式构造
- vector<int>v2(v1.begin(), v1.end());
- printVector(v2);
-
- //n个elem的构造
- vector<int> v3(10, 100);
- printVector(v3);
-
- //拷贝构造
- vector<int> v4(v3);
- printVector(v4);
- }
- int main()
- {
- test01();
-
- }
功能:为vector容器进行赋值
可以用“=”号进行赋值,也可使用函数assign赋值。
- #include<iostream>
- #include<vector>
- using namespace std;
- void printVector(vector<int>& v)
- {
- for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
- void test01()
- {
- vector<int> v1; //默认构造,无参构造
- for (int i = 0; i < 10; i++)
- {
- v1.push_back(i);
- }
- printVector(v1);
-
- //等号赋值
- vector<int> v2;
- v2 = v1;
- printVector(v2);
-
- //assign方式
- vector<int> v3;
- v3.assign(v1.begin(),v1.end());
- printVector(v3);
- }
- int main()
- {
- test01();
-
- }
| Empty() | 判断容器是否为空 |
| Capacity() | 容器的容量 |
| Size() | 返回容器中元素的个数 |
| Resize(int num) | 重新制定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除。 |
| Resize(int num, elem) | 重新制定容器的长度为num,若容器变长,则以elem填充新位置;如果容器变短,则末尾超出容器长度的元素被删除。 |
- #include<iostream>
- #include<vector>
- using namespace std;
- void printVector(vector<int>& v)
- {
- for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
- void test01()
- {
- vector<int> v1; //默认构造,无参构造
- for (int i = 0; i < 10; i++)
- {
- v1.push_back(i);
- }
- printVector(v1);
-
- //判断是否为空
- if (v1.empty())
- {
- cout << "v1 为空!" << endl;
- }
- else
- {
- cout << "v1 不为空!" << endl;
- cout << "v1的容量为多少" << v1.capacity() << endl; //将输出13
- cout << "v1的大小为多少" << v1.size() << endl; //将输出10
- }
-
- //重新指定大小
- v1.resize(15);
- printVector(v1); //将在后面添加5个默认值,默认值为0
-
- v1.resize(5);
- printVector(v1); //如果重新制定的短了,超出部分会被删掉
- }
- int main()
- {
- test01();
- }
| Push_back(elem) | 尾部插入元素elem |
| Pop_back() | 删除最后一个元素 |
| Insert(const_iterator pos, elem) | 迭代器向指定位置pos插入元素elem |
| Insert(const_iterator pos, int count elem) | 迭代器向指定位置pos插入count个元素elem |
| Erase(const_iterator pos) | 删除迭代器指向的元素 |
| Erase(const_iterator start, const_iterator end) | 删除迭代器从strat到end之间的所有元素 |
| Clear() | 删除容器中所有元素 |
- #include<iostream>
- #include<vector>
- using namespace std;
- void printVector(vector<int>& v)
- {
- for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
- void test01()
- {
- vector<int> v1;
- v1.push_back(10); //尾插法插入数据
- v1.push_back(20);
- v1.push_back(30);
- v1.push_back(40);
- //遍历
- printVector(v1);
-
- //删除尾部元素
- v1.pop_back();
- printVector(v1);
-
- //插入,第一个参数是迭代器
- v1.insert(v1.begin(), 100);
- printVector(v1);
- //插入多个数据
- v1.insert(v1.begin(), 2,1000);
- printVector(v1);
-
- //删除特定位置的元素
- v1.erase(v1.begin());
- printVector(v1);
- //删除区间的元素
- v1.erase(v1.begin()+1,v1.end()-2);
- printVector(v1);
- }
- int main()
- {
- test01();
- }
| At(int idx) | 通过索引idx指向数据 |
| operator[] | []返回,和数组一样 |
| Front | 返回容器中第一个数据元素 |
| Back | 返回容器中最后一个数据元素 |
功能:实现两个容器内的元素交换。
实际用途:巧用swap可以收缩内存空间
- #include<iostream>
- #include<vector>
- using namespace std;
- void printVector(vector<int>& v)
- {
- for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
- void test01()
- {
- vector<int> v1;
- for (int i = 0; i < 10; i++)
- {
- v1.push_back(i);
- }
- cout << "交换前:" << endl;
- printVector(v1);
- vector<int> v2;
- for (int i = 10; i >0; i--)
- {
- v2.push_back(i);
- }
- printVector(v2);
- cout << "交换后:" << endl;
- v1.swap(v2); //进行交换
- printVector(v1);
- printVector(v2);
- }
- void test02() //利用swap收缩内存空间
- {
- vector<int> v;
- for (int i = 0; i < 10000; i++)
- {
- v.push_back(i);
- }
- cout << "v的容量:" << v.capacity() << endl;
- cout << "v的大小:" << v.size() << endl;
-
- v.resize(3);
- cout << "v的容量:" << v.capacity() << endl; //容量不会变成3
- cout << "v的大小:" << v.size() << endl; //大小会变成3
- //利用swap收缩内存
- vector<int>(v).swap(v); //先创建一个匿名对象,然后与之交换
- //匿名对象在该行执行完之后将被系统自动回收
- cout << "v的容量:" << v.capacity() << endl;
- cout << "v的大小:" << v.size() << endl;
- }
- int main()
- {
- //test01();
- test02();
- }
功能:减少vector在动态扩展容量时的扩展次数。预留位置不会初始化,元素不可访问。
- #include<iostream>
- #include<vector>
- using namespace std;
- void printVector(vector<int>& v)
- {
- for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
- void test01()
- {
- vector<int> v;
- v.reserve(10000); //上来直接分很长的空间,如果不预留,num会等于24
-
- int num = 0; //统计内存开辟次数
- int* p = NULL;
- for (int i = 0; i < 10000; i++)
- {
- v.push_back(i);
- if (p != &v[0])
- {
- p = &v[0];
- num++;
- }
- }
- cout << num << endl;
- }
-
- int main()
- {
- test01();
- }