C++容器之Vector总结

1.什么是Vector

向量(Vector) 是一个封装了动态大小数组的 顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组

2.Vector的内存机制

Vector在内存中的结构和数组一样,就是一段连续的内存空间,不过Vector是动态的数组,当Vector中的数据增加并超过当前最大容量的时候,Vector会在内存中找到另外一段更大容量的内存,将数据拷贝至新的内存空间中,并且释放原来的内存空间。
用代码验证一下:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> temp;
	for (int i = 0;i < 100;i++)
	{
		temp.push_back(i);
		cout << "当前数组容量是"<<temp.capacity()<<"  ";
		cout << "当前数组中数据的数量是" << temp.size() <<endl;
	}
}

输出的结果是:

当前数组容量是1 当前数组中数据的数量是1
当前数组容量是2 当前数组中数据的数量是2
当前数组容量是3 当前数组中数据的数量是3
当前数组容量是4 当前数组中数据的数量是4
当前数组容量是6 当前数组中数据的数量是5
当前数组容量是6 当前数组中数据的数量是6
当前数组容量是9 当前数组中数据的数量是7
当前数组容量是9 当前数组中数据的数量是8
当前数组容量是9 当前数组中数据的数量是9
当前数组容量是13 当前数组中数据的数量是10
当前数组容量是13 当前数组中数据的数量是11
当前数组容量是13 当前数组中数据的数量是12
当前数组容量是13 当前数组中数据的数量是13
当前数组容量是19 当前数组中数据的数量是14
当前数组容量是19 当前数组中数据的数量是15
当前数组容量是19 当前数组中数据的数量是16

当前数组容量是94 当前数组中数据的数量是90
当前数组容量是94 当前数组中数据的数量是91
当前数组容量是94 当前数组中数据的数量是92
当前数组容量是94 当前数组中数据的数量是93
当前数组容量是94 当前数组中数据的数量是94
当前数组容量是141 当前数组中数据的数量是95
当前数组容量是141 当前数组中数据的数量是96
当前数组容量是141 当前数组中数据的数量是97
当前数组容量是141 当前数组中数据的数量是98
当前数组容量是141 当前数组中数据的数量是99
当前数组容量是141 当前数组中数据的数量是100

其中capacity()函数表示的是向量所表示的动态数组当前的容量。
可以看出每一次向量每一次增加容量的时候,增加的容量的值都是原来的一半
例如141=94+94/2
关于内存机制的具体内容可以看这篇文章,这里不再赘述。
vector内存机制和性能分析

3.Vector的基本操作

1.Vector的初始化

1.构造函数
  vector():创建一个空vector
  vector(int nSize):创建一个vector,元素个数为nSize
  vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
  vector(const vector&):复制构造函数
  vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
代码用例:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	int b[10] = { 1,2,3,4,5,6,7,8,9,10};
	vector<int> v1;
	vector<int> v2(10);
	vector<int> v3(10,1);
	vector<int> v4(v3);
	vector<int> v5(b, b + 10);

}

2.Vector操作

1 vector.assign()//vector的格式化
vector.assign(b.begin(),b.begin()+5);//b为另一个vector,这个重载的功能相当于格式化vector,并将向量b中的前五个元素装入vector中
vector.assign(4,1);//这个重载的功能是让vector格式化,然后将vector的内容填充为4个1

可见vector.assign()的功能是格式化vector,并填入新的数

2.vector的增加删除

增加:

a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
a.insert(a.begin()+1,b+3,b+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6)
a.push_back(5);//在a的最后插入一个元素5

删除:

a.clear();//清空a
a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+ 3(不包括它)
a.pop_back()//删除向量中的最后一个元素
3.vector的修改

想要修改vector中的元素有三种方法

注意:以下方法均需要vector中已经有元素,且以下方法均不能修改vector的长度,也不能超出vector的长度

//1: 利用迭代器
    for(auto it = ivec.begin(); it != ivec.end(); ++it)
    {
        *it = *it * 2;
        cout<<*it<<" ";
    }
    cout<<endl;
    //2: 利用下标操作符
    for(auto i = 0; i < ivec.size(); ++i)
    {
        ivec[i] = ivec[i] * 2;
        cout<<ivec[i]<<" ";
    }
    cout<<endl;
    //3: 利用范围for循环
    for(auto &i : ivec)//注意此处是引用
    {
        i = i * 2;
        cout<<i<<" ";
    }
    cout<<endl;

   return 0;
}
4.vector的其他函数
a.empty();//判断向量是否为空,空则返回true,否则返回false
a.size(); //返回a中元素的个数;
a.capacity(); //返回a在内存中总共可以容纳的元素个数
a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2
a.reserve(100); //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是	100.这种操作只有在需要给a添加大量数据的时候才         显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能) 
a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换