vector容器 (20221115)

本文详细介绍了C++标准库中的vector容器,包括其动态扩展、插入删除操作、数据存取方式以及如何通过swap函数高效地管理内存。还展示了预留空间的功能,以减少动态扩展时的开销,并提供实例说明了预留空间的使用效果。
摘要由CSDN通过智能技术生成

一、vector容器

1、功能:与数组非常相似,也称为单端数组。

2、区别:数组是静态空间,vector可以动态扩展。

动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,将原数据拷贝到新空间,释放原空间。

3、vector迭代器是支持随机访问的迭代器

4、构造函数

5、vector的容量和大小

函数原型:

empty(); 判断元素是否为空

capacity(); 容器的容量

size(); 返回容器中元素个数

resize(int num);重新指定容器的长度num,若变长,则以默认值填充,若变短,则删除超出容器长度的元素

resize(int num,elem); 重新指定容器的长度num,若变长,则以elem填充,若变短,则删除超出容器长度的元素.

6、vector的插入和删除

push_back(ele); 尾部插入

pop_back();尾部删除

insert(const_iterator pos,ele); 迭代器指向位置pos插入元素ele

insert(const_iterator pos,int count,ele); 迭代器指向位置pos插入count个元素ele

erase(const_iterator pos); 删除迭代器指向元素

erase(const_iterator start, const_iterator end); 删除迭代器指向区间元素

clear();删除容器中全部元素

7、vector的数据存取

at(int idx); //返回容器中idx所指的数据

operator[]; //返回索引idx所指的数据

front(); //返回容器第一个数据元素

back();//返回最后一个元素

代码:

#include<iostream>

using namespace std;

#include<vector>

void printVector(vector<int>&v)

{

    for (int i = 0; i < v.size(); i++)

    {

        cout << v[i] << " ";

    }

    cout << endl;

    for (int i = 0; i < v.size(); i++)

    {

        cout << v.at(i) << " ";

    }

    cout << endl;

}

void test01()

{

    vector<int>v1;

    for (int i = 0; i < 10; i++)

    {

        v1.push_back(i);

    }

    printVector(v1);

    //输出第一个元素

    cout << "第一个元素为:" << v1.front() << endl;

    cout << "最后一个元素为:" << v1.back() << endl;

}

8、vector互换容器

实现两个容器的互换

函数原型:swap(vec);//将vec与本身的元素互换

代码:

void printVector(vector<int>&v)

{

    for (int i = 0; i < v.size(); i++)

    {

        cout << v[i] << " ";

    }

    cout << endl;

    for (int i = 0; i < v.size(); i++)

    {

        cout << v.at(i) << " ";

    }

    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 = 11; i < 20; i++)

    {

        v2.push_back(i);

    }

    printVector(v2);

    cout << "交换后:" << endl;

    v1.swap(v2);

    printVector(v1);

    printVector(v2); 

}

效果:

实际作用:

巧用swap()可以收缩内存空间:

void test02()

{

    vector<int>v3;

    for (int i = 0; i < 100000; i++)

    {

        v3.push_back(i);

    }

    cout << "v3的大小为:" << v3.size() << endl;

    cout << "v3的容量为:" << v3.capacity()<< endl;



    //重新指定大小

    v3.resize(3);

    cout << "v3的大小为:" << v3.size() << endl;

    cout << "v3的容量为:" << v3.capacity() << endl; //此时大小为3  容量为138255 浪费空间

    //用swap收缩内存

    vector<int>(v3).swap(v3);

    //vector<int>(v3)是以v3作为拷贝对象,拷贝构造一个匿名对象,

    //然后做一个容器之间的交换,交换后v3指向的是交换前匿名对象所指向的空间,容量为3,而匿名对象指向的是原本v3的空间,容量大小为138255

    //匿名对象的特点:使用完毕后 系统会自动回收其空间

    cout << "v3的大小为:" << v3.size() << endl;

    cout << "v3的容量为:" << v3.capacity() << endl;//此时大小为3  容量为3 浪费空间

}

9、预留空间

功能:减少vector在动态扩展时的扩展次数

reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

//利用reserve预留空间

void test02()

{

    vector<int>v;

    int num=0;//统计开辟次数

    v.reserve(100000);

    int *p = NULL;

    for (int i = 0; i < 100000; i++)

    {

        v.push_back(i);

        if (p != &v[0])//如果p不指向首地址,则使其指向首地址

        {

            p = &v[0];

            num++;

        }

    }

    cout << "次数:" << num << endl; //没有预留 num=30 预留后num=1

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值