持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天点击查看活动详情
就是动态数组 动态扩展并不是再原空间之后 续接新空间 而是找到一块更大的连续内存空间 然后将原数据拷贝过去
在尾部插入和删除
插入数据原理
插入数据时如果未超过当前容量 就是这一块连续地址又还能再插入数据 则直接在末尾插入数据就行 如果没有剩余空间了 则会重新分配原有元素个数的两倍空间 然后将原来空间的数据拷贝到新空间中 再向新空间增加数据 释放原来的数据 之前的迭代器也会失效 而且如果在数组中间进行增删操作 整个地址空间也需要重新申请和释放源空间 对之前数据进行拷贝
构造函数
vector< T > v
默认构造函数 T是该vector的类型 v是对象名
vector(v.begin(),v.end());
将v[begin(),end())区间中的元素拷贝给本身
vector(n,elem)
将n个elem数拷贝给本身 例如 vector(10,2)就是将是个二复制给vector
迭代器iterator
for(vector<int>::iterator it = v.begin();it!= v.end();it++)
{
cout<<*it;
}
(指向第一个元素)v.begin()
v.end()(指向最后一个元素的下一个位置)
v.rbegin()(指向倒数第一个元素的位置)
v.rend()(指向第一个元素的前一个位置)
二维vector初始化为0
vector<vector< bool >> temp(6, vector< bool >(7));
v.resize()改变当前容器内含有元素的数量
v.resize(50);
假设原来的是只有10个元素 使用resize(50)后 那么容器新增(len-size)个元素 元素的值为默认为0 元素的值为默认为0 当v.push_back(3);之后,则是3是放在了v的末尾,即下标为50,此时容器是size为len+1; 改变当前容器内含有元素的数量
v.reserver()改变当前容器的最大容量
它不会生成元素,只是确定这个容器允许放入多少对象,如果reserve(len)的值大于当前的capacity(),那么会重新分配一块能存len个对象的空间,然后把之前v.size()个对象通过copy construtor复制过来,销毁之前的内存;
int main() {
vector<int> a;
a.reserve(100);
a.resize(50);
cout<<a.size()<<" "<<a.capacity()<<endl;
//50 100
a.resize(150);
cout<<a.size()<<" "<<a.capacity()<<endl;
//150 200
a.reserve(50);
cout<<a.size()<<" "<<a.capacity()<<endl;
//150 200
a.resize(50);
cout<<a.size()<<" "<<a.capacity()<<endl;
//50 200
}
v.push_back()和v.emplace_back()
emplace_back() 和 push_back() 的区别 push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素); emplace_back() 则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程
验证
vector<A> a;//底层是动态数组
cout << "emplace_back" << endl;
for (int i = 0; i < 100; i++)
{
a.emplace_back(i);
if (a.size() == a.capacity()) //通过对size和capacity的比较,可以判断什么时候发生内存重新分配
{
cout <<"重新分配内存:"<<"capacity:" << a.capacity() << ", " << "size" << a.size() << endl;
}
cout << i << endl;//这是第几次循环
}
主要看0上面那次和3,4两次 只有在重新分配内存后才会调用拷贝构造函数 从第一次调用可以看出来 emplace_back没有调用拷贝构造函数 那后面为什么会调用呢?因为重新申请了内存 需要把之前的数据拷贝到新的内存上去 但是新emplace_back的新数据就不会调用拷贝构造函数 与之对比调用push_back 会发现每一次都调用了拷贝构造函数