C++-vector

70 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 在这里插入图片描述 会发现每一次都调用了拷贝构造函数