STL(标准模板库)-vector容器

1、vector容器的概述

在这里插入图片描述
单端动态数组
vector容器的迭代器 :随机访问迭代器
随机访问迭代器:迭代器+n 可以通过编译 就是随机访问迭代器

2、vector的容量capacity和大小szie的区别(了解)

capacity:空间能容纳元素最大个数。
size:空间中实际存放的元素个数。
在这里插入图片描述
容量 >= 元素的个数size
为啥插入100个元素 容量确实128?原因vector的未雨绸缪机制

3、vector的未雨绸缪机制(了解)

{
    vector<int> v;
    int *p = NULL;
    int count =0;
    for(int i=0;i<1000;i++)
    {
        if(p != &v[0])
        {
            cout<<"----------"<<count++<<"-----"<<endl;
            p=&v[0];
        }

        v.push_back(i);
        cout<<"cacapity = "<<v.capacity()<<", size = "<<v.size()<<endl;
    }
}

运行结果:
在这里插入图片描述
只要空间满 就会另寻空间。

4、vector的构造函数

 vector构造函数
vector<T> v; //采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem);//构造函数将n个elem拷贝给本身。
vector(const vector &vec);//拷贝构造函数。

void printVectorInt(vector<int> &v)
{
    for(vector<int>::iterator it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}
void test04()
{
    //vector(n, elem);//构造函数将n个elem拷贝给本身
    vector<int> v1(10,5);
    printVectorInt(v1);

    //vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身
    vector<int> v2(v1.begin()+2, v1.end()-2);
    printVectorInt(v2);

    vector<int> v3(v1);
    printVectorInt(v3);
}

运行结果:
在这里插入图片描述

5、vector赋值与交换语句

案例:赋值交换

vector常用赋值操作
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
vector& operator=(const vector  &vec);//重载等号操作符
swap(vec);// 将vec与本身的元素互换。

void printVectorInt(vector<int> &v)
{
    for(vector<int>::iterator it=v.begin(); it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}
void test01()
{
    vector<int> v1(5,10);
    vector<int> v2;

    //vector& operator=(const vector  &vec);//重载等号操作符
    v2 = v1;
    printVectorInt(v2);

    //assign(n, elem);//将n个elem拷贝赋值给本身
    vector<int> v3;
    v3.assign(5,100);
    printVectorInt(v3);

    //assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身
    vector<int> v4;
    v4.assign(v3.begin(), v3.end());
    printVectorInt(v4);

    //swap(vec);// 将vec与本身的元素互换。
    vector<int> v5(5,20);
    vector<int> v6(10,40);
    printVectorInt(v5);
    printVectorInt(v6);
    v5.swap(v6);
    printVectorInt(v5);
    printVectorInt(v6);
}

运行结果:
在这里插入图片描述

6、vector大小操作

案例:

 vector大小操作
size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问

void test02()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);

    if(v.empty())
    {
        cout<<"v容器为空"<<endl;
    }
    else
    {
        cout<<"容器非空"<<endl;
        cout<<"size = "<<v.size()<<endl;
        cout<<"capacity = "<<v.capacity()<<endl;
        //容量 >= size
    }

    printVectorInt(v);//10 20 30 40
    //resize(int num);//重新指定容器的长度为num
    //多出的部分 自动补0
    v.resize(8);
    printVectorInt(v);//10 20 30 40 0 0 0 0

    //resize(int num, elem);//重新指定容器的长度为num,
    //若容器变长,则以elem值填充
    v.resize(10,5);
    printVectorInt(v);//10 20 30 40 0 0 0 0 5 5
    
    v.resize(2);
    printVectorInt(v);//10 20
}

案例2:resize 作用的容器的大小 不会更改容器的容量

void test03()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);
    v.push_back(60);

    cout<<"size = "<<v.size()<<endl;
    cout<<"capactiy = "<<v.capacity()<<endl;
    printVectorInt(v);

    cout<<"----------------"<<endl;
    v.resize(2);
    cout<<"size = "<<v.size()<<endl;
    cout<<"capactiy = "<<v.capacity()<<endl;
    printVectorInt(v);
}

运行结果:
在这里插入图片描述

7、使用resize swap收缩容器的容量

在这里插入图片描述

void test04()
{
    vector<int> v;
    for(int i=0;i<1000;i++)
    {
        v.push_back(i);
    }
    cout<<"size = "<<v.size()<<endl;//1000
    cout<<"capactiy = "<<v.capacity()<<endl;//1024

    //使用reszie将空间 置成10个元素(可以吗?)
    v.resize(10);//不能修改容量 只能修改size
    cout<<"size = "<<v.size()<<endl;//10
    cout<<"capactiy = "<<v.capacity()<<endl;//1024

    //使用swap收缩容器的容量
    vector<int>(v).swap(v);

    cout<<"size = "<<v.size()<<endl;//10
    cout<<"capactiy = "<<v.capacity()<<endl;//10
}

运行结果:
在这里插入图片描述

8、reserve预留空间大小

//reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问
void test05()
{
    vector<int> v;

    //一次性 给够空间 叫空间预留
    v.reserve(1000);//预留空间 1000个元素

    int *p = NULL;
    int count = 0;
    for(int i=0;i<1000;i++)
    {
        v.push_back(i);
        if(p != &v[0])
        {
            count++;
            p = &v[0];
        }
    }
    cout<<"重新另寻空间次数:"<<count<<endl;
}

运行结果:
如果没有:v.reserve(1000); 结果为11
如果有:v.reserve(1000); 结果为1

9、数据的存取

vector数据存取操作
at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
operator[];//返回索引idx所指的数据,越界时,运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素

void test06()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);

    printVectorInt(v);//10 20 30 40
    cout<<v[2]<<endl;//30
    cout<<v.at(2)<<endl;//30
    //[] 越界 不抛出异常
    //at 越界 抛出异常

    cout<<"front = "<<v.front()<<endl;//10
    cout<<"back = "<<v.back()<<endl;//40
}

10、vector容器的插入和删除

 vector插入和删除操作
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
push_back(ele); //尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素

void test07()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    printVectorInt(v);//10 20 30 40

    //insert(const_iterator pos, int count,ele);
    //迭代器指向位置pos插入count个元素ele.
    v.insert(v.begin()+2,3,100);
    printVectorInt(v);//10 20 100 100 100 30 40

    //尾部删除:pop_back();//删除最后一个元素
    v.pop_back();//将40删除了
    printVectorInt(v);//10 20 100 100 100 30

    //erase(const_iterator start, const_iterator end);
    //删除迭代器从start到end之间的元素
    v.erase(v.begin()+2, v.end()-1);
    printVectorInt(v);//10 20 30

    //erase(const_iterator pos);//删除迭代器指向的元素
    v.erase(v.begin()+1);//删除20的位置
    printVectorInt(v);//10 30

    cout<<"size = "<<v.size()<<", capacity = "<<v.capacity()<<endl;

    //clear();//删除容器中所有元素
    v.clear();
    printVectorInt(v);//啥也没有
    cout<<"size = "<<v.size()<<", capacity = "<<v.capacity()<<endl;
}

运行结果:
在这里插入图片描述

11、vector 对自定义数据 排序指定排序规则

11.1、方法一 普通函数 实现排序规则

bool myComparePerson(const Person &ob1, const Person &ob2)
{
    return ob1.age > ob2.age;
}

void test04()
{
    vector<Person> v;
    v.push_back(Person("德玛西亚",48));
    v.push_back(Person("提莫", 28));
    v.push_back(Person("狗头", 18));
    v.push_back(Person("牛头", 19));
    PrintVectorPerson(v);

    //默认比较方式从小-->大
    //vector存放自定义数据 可指定排序规则 (普通函数)
    sort(v.begin(),v.end(),myComparePerson);

    PrintVectorPerson(v);
}

运行结果:
在这里插入图片描述

11.2、方法二 仿函数 指定排序规则

//仿函数指定排序规则
class myComparePerson2
{
public:
    bool operator()(Person &ob1, Person &ob2)
    {
        return ob1.age < ob2.age;
    }
};

void test04()
{
    vector<Person> v;
    v.push_back(Person("德玛西亚",48));
    v.push_back(Person("提莫", 28));
    v.push_back(Person("狗头", 18));
    v.push_back(Person("牛头", 19));
    PrintVectorPerson(v);

    //默认比较方式从小-->大
    //vector存放自定义数据 可指定排序规则 (普通函数)
    //sort(v.begin(),v.end(), myComparePerson);

    //vector存放自定义数据 可指定排序规则 (仿函数)
    sort(v.begin(),v.end(), myComparePerson2() );

    PrintVectorPerson(v);
}

运行结果:
在这里插入图片描述

11.3、回顾仿函数 重载函数调用运算符()

class MyAdd{
public:
    //本质就是成员函数 函数名叫operator()
    int operator()(int a, int b)
    {
        cout<<"调用了operator() int int"<<endl;
        return a+b;
    }
    int operator()(int a, int b, int c)
    {
        cout<<"调用了operator()int int int "<<endl;
        return a+b+c;
    }

};
void test05()
{
    MyAdd ob1;
    cout<<ob1.operator ()(10,20)<<endl;
    //编译器优化
    //严格意义:ob1是对象 和()结合 调用operator ()成员函数
    //ob1(100,200) ob1本质是对象不是函数名 只是形式像函数调用
    //叫做仿函数
    cout<<ob1(100,200)<<endl;
    cout<<ob1(100,200,300)<<endl;

    cout<<MyAdd()(1000,2000)<<endl;

}

运行结果:
在这里插入图片描述

发布了78 篇原创文章 · 获赞 45 · 访问量 9268

猜你喜欢

转载自blog.csdn.net/weixin_43288201/article/details/105233053