C++-vector

就是动态数组
动态扩展并不是再原空间之后 续接新空间 而是找到一块更大的连续内存空间 然后将原数据拷贝过去

在尾部插入和删除

插入数据原理

插入数据时如果未超过当前容量 就是这一块连续地址又还能再插入数据 则直接在末尾插入数据就行
如果没有剩余空间了 则会重新分配原有元素个数的两倍空间 然后将原来空间的数据拷贝到新空间中 再向新空间增加数据 释放原来的数据 之前的迭代器也会失效
而且如果在数组中间进行增删操作 整个地址空间也需要重新申请和释放源空间 对之前数据进行拷贝

构造函数

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
在这里插入图片描述
会发现每一次都调用了拷贝构造函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值