STL模板库-Vector容器

目录

vector 容器基本概念

头文件

vector 迭代器

 迭代器遍历

 未雨绸缪机制

构造函数

​编辑

常用赋值操作

 vector大小操作

预留空间

 插入于删除

巧用swap

存自定义对象

容器嵌套容器


vector 容器基本概念

vector 的数据安排以及操作方式,与 array 非常相似,两者的唯一差别在于空间的 运用的灵活性。

Array 是静态空间,一旦配置了就不能改变。

Vector 是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。

vector容量是用来装元素的,不同类型元素都可存储(内置模板)

vector是单端动态容器:一个入口和出口,且可以动态开辟空间

vector和自定义MyArray非常类似: push_back-存(动态开辟二倍) pop_back_取出

push_back():        尾部插入

pop_back()           尾部删除

v.begin()               返回的是vector容器的起始迭代器(首元素的位置)

v.end()                  返回的是vector容器的结束迭代器(尾元素的下一个元素位置)。

vector                   是随机访问迭代器。(随意根据下标取元素)

头文件

#include <vector>

vector 迭代器

Vector 维护一个线性空间,所以不论元素的型别如何,普通指针都可以作为 vector 的迭代器,因为 vector 迭代器所需要的操作行为,如 operaroe, operator->, operator++, operator--, operator+, operator-, operator+=, operator-=, 普通指针天生 具备。Vector 支持随机存取,而普通指针正有着这样的能力。所以 vector 提供的 是随机访问迭代器(Random Access Iterators).

根据上述描述,如果我们写如下的代码:

Vector::iterator it1;
Vector::iterator it2;

 it1 的型别其实就是 Int,it2 的型别其实就是 Teacher*.

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> v;
    for (int i = 0; i < 10;i ++){
        v.push_back(i);
        cout << v.capacity() << endl; // v.capacity()容器的容量
    }
    system("pause");
    return EXIT_SUCCESS;
}

注意: 所谓动态增加大小,并不是在原空间之后续接新空间(因为无法保证原空间之后尚 有可配置的空间),而是一块更大的内存空间,然后将原数据拷贝新空间,并释放原空间。因此,对 vector 的任何操作,一旦引起空间的重新配置,指向原 vector 的所有迭代器就都失效了。这是程序员容易犯的一个错误,务必小心。 

 迭代器遍历

#include <vector>    //使用vector容器需要添加该头文件
void test_01()
{
    vector <int>v(5,10);
    cout<<"大小:"<<v.size()<<"  容量"<<v.capacity()<<endl;    //5  5
    vector<int>::iterator it = v.begin();      //定义迭代器
    while(it != v.end())    //使用迭代器遍历 迭代器等于v.end时遍历结束
    {
        cout<<*it++<<" ";   //*it取元素
    }
    cout<<endl;
}

 未雨绸缪机制

vector空间不够时,自动扩容,每次扩2倍

#include <vector>
void test_01()
{
    vector <int>v;    //定义一个空的vector容器
    cout<<"大小:"<<v.size()<<"  容量"<<v.capacity()<<endl;    //0 0 
    int cunt = 0;    //判断第几次增容
    vector<int>::iterator it = v.begin();    //将迭代器指向头(v.begin)
    for(int i=0;i<1000;i++)    //使vector遍历增容一千次
    {
        v.push_back(i);    //尾插赋值
        if(it != v.begin())    //判断是否增容
        {
            cout<<"第"<<cunt<<"增容"<<v.capacity()<<endl;    //增容后打印
            cunt++;    //增加打印次数
            it = v.begin();   //更新迭代器指向的地址
        }
    }
}

构造函数

构造函数
vector v; 采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());将 v[begin(), end()]区间中的元素拷贝给本身。
vector(n, elem);构造函数将 n 个 elem 拷贝给本身。
vector(const vector &vec);拷贝构造函数。
#include <vector>        //头文件
void printvector(vector<int> &v)    //使用迭代器打印
{
    vector<int>::iterator it = v.begin();
    while(it != v.end())    //使用迭代器遍历容器
    {
        cout<<*it++<<" ";    //迭代器++
    }
    cout<<endl;
}
void test_01()
{
    //1. vector v; 	采用模板实现类实现,默认构造函数 
    vector <int>v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    cout<<"--------v--------"<<endl;
    printvector(v);                  //10 20 30 40 
    cout<<"v:大小:"<<v.size()<<"  容量:"<<v.capacity()<<endl;   // 4  4

    //2. vector(v.begin(), v.end());	将 v[begin(), end()]区间中的元素拷贝给本身。 
    cout<<"--------v1--------"<<endl;
    int arr[] = {2,3,4,1,9};
    vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));
    printvector(v1);                 //2,3,4,1,9
    cout<<"v:大小:"<<v1.size()<<"  容量:"<<v1.capacity()<<endl;   //5 5

    //3. vector(const vector &vec);	拷贝构造函数。
    vector <int>v3 = v;
    cout<<"--------v3--------"<<endl;
    printvector(v3);                //10 20 30 40 50
    cout<<"v3:大小:"<<v3.size()<<"  容量:"<<v3.capacity()<<endl;    //5 8
}

常用赋值操作

常用赋值操作
assign(beg, end);将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);/将 n 个 elem 拷贝赋值给本身。
vector& operator=(const vector &vec);重载等号操作符。
swap(vec);将 vec 与本身的元素互换。
#include <vector>
void printvector(vector<int> &v)
{
    vector<int>::iterator it = v.begin();
    while(it != v.end())
    {
        cout<<*it++<<" ";
    }
    cout<<endl;
}
void test_01()
{
    vector <int>v;    //初始化一个vector容器
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);
    printvector(v);      //10 20 30 40 50
    cout<<"v:大小:"<<v.size()<<"  容量:"<<v.capacity()<<endl;    //5 8

    //1. vector& operator=(const vector &vec);	重载等号操作符。
    vector <int>v3;
    v3 = v;
    cout<<"--------v3--------"<<endl;
    printvector(v3);        //10 20 30 40 50
    cout<<"v3:大小:"<<v3.size()<<"  容量:"<<v3.capacity()<<endl;    //5 5
    
    //2. assign(beg, end);	将[beg, end)区间中的数据拷贝赋值给本身。
    vector <int>v1;
    v1.assign(v.begin(),v.end());    
    cout<<"--------v1--------"<<endl;
    printvector(v1);        //10 20 30 40 50
    cout<<"v1:大小:"<<v1.size()<<"  容量:"<<v1.capacity()<<endl;    //5 5
    
    //3. assign(n, elem);	/将 n 个 elem 拷贝赋值给本身。
    vector <int>v2;
    v2.assign(5,10);
    cout<<"--------v2--------"<<endl;
    printvector(v2);    //10 10 10 10 10
    cout<<"v2:大小:"<<v2.size()<<"  容量:"<<v2.capacity()<<endl;    //5 5
    
    //swap(vec);	将 vec 与本身的元素互换。
    v3.swap(v2);
    cout<<"--------v2--------"<<endl;
    printvector(v2);    //10 20 30 40 50
    cout<<"v2:大小:"<<v2.size()<<"  容量:"<<v2.capacity()<<endl;    //5 5
    cout<<"--------v3--------"<<endl;
    printvector(v3);    //10 10 10 10 10
    cout<<"v3:大小:"<<v3.size()<<"  容量:"<<v3.capacity()<<endl;    //5 5
}

 vector大小操作

大小操作
size();返回容器中元素的个数
empty();判断容器是否为空
resize(int num);重新指定容器的长度为 num,若容器变长,则以默认值填充新位置。 如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);重新指定容器的长度为 num,若容器变长,则以 elem 值填 充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
capacity();容器的容量
#include <vector>
void printvector(vector<int> &v)
{
    vector<int>::iterator it = v.begin();
    while(it != v.end())
    {
        cout<<*it++<<" ";
    }
    cout<<endl;
}
void test_01()
{
    vector <int>v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    if(!v.empty())    //empty();	判断容器是否为空 不为空打印
    {
        //size();	返回容器中元素的个数   capacity();	容器的容量
        cout<<"大小:"<<v.size()<<"  容量:"<<v.capacity()<<endl;    //4 4
    }
    printvector(v);    //10 20 30 40
    v.resize(8);    //重置大小 8个空间 不足补零
    //v.resize(8,100);    //重置大小 8个空间 不足补100
    //v.resize(2);        //重置大小 10 20
    if(!v.empty())    //empty();	判断容器是否为空 不为空打印
    {
        cout<<"大小:"<<v.size()<<"  容量:"<<v.capacity()<<endl;    //8 8
    }
    printvector(v);    //10 20 30 40 0 0 0 0

    cout<<"头元素:"<<v.front()<<"尾元素:"<<v.back()<<endl;    //10 0
    //[]不会抛出异常 at()会抛出异常可被catch捕获
    cout<<"元素:"<<v[2]<<"元素:"<<v.at(3)<<endl; //30 40
}

预留空间

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

void test_01()
{
    vector <int>v;    //无参构造
    cout<<"大小"<<v.size()<<" 容量"<<v.capacity()<<endl;    //0 0
    v.reserve(1000);    //预留1000个空间
    cout<<"大小"<<v.size()<<" 容量"<<v.capacity()<<endl;    //0 1000
} 

 插入于删除

插入于删除
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();删除容器中所有元素
#include <vector>
void printVectorInt(vector<int> &v)
{
    vector<int>::iterator it = v.begin();
    while(it != v.end())
    {
        cout<<*it++<<" ";
    }
    cout<<endl;
}
void test_01()
{
    vector <int>v;
    //push_back(ele);	尾部插入元素 ele
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);
    printVectorInt(v);  //10 20 30 40 50
    //pop_back();	删除最后一个元素
    v.pop_back();
    v.pop_back();
    v.pop_back();
    printVectorInt(v);  //10 20 30
   
    //insert(const_iterator pos, int count,ele);	
    //迭代器指向位置 pos 插入 count 个元素 ele
    v.insert(v.begin()+1,3,100);    //从下标1位置添加三个100
    printVectorInt(v);  //10 100 100 100 20
    //erase(const_iterator start, const_iterator end);	
    //删除迭代器从 start 到 end 之间的元素
    v.erase(v.begin()+1,v.begin()+4);   //从下标1位置向后删除到下标4位置
    //v.erase(v.begin(),v.end()); //删除所有
    //clear();	删除容器中所有元素
    //v.clear();  //删除所有
    printVectorInt(v);  //10 20
}

巧用swap

作用:将预留的空间但没用到了 清除

void test_01()
{
    vector <int>v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);
    v.reserve(100);
    cout<<"大小"<<v.size()<<" 容量"<<v.capacity()<<endl;    //5 100
    (vector <int>(v)).swap(v);  //匿名对象 不会保留预留空间
    cout<<"大小"<<v.size()<<" 容量"<<v.capacity()<<endl;    //5 5
}

存自定义对象

使用vector容器存储自定义的对象并打印

#include <vector>
class Person    //创建一个类
{
    friend void printVectorPerson(vector <Person>&v);   //将打印函数作为友元
private:
    string name;
    int age;    
public:
    Person(){}  //无参构造
    Person(string name,int age)     //有参构造
    {
        this->name = name;
        this->age = age;
    }
};

void printVectorPerson(vector <Person>&v)   //打印函数
{
    vector <Person>::iterator it = v.begin();
    while(it != v.end())    //判断迭代器是否遍历到最后
    {
        cout<<(*it).name<<" "<<(*it).age<<endl; //解引用后才可以访问类成员属性
        it++;   //迭代器++
    }
}

void test_01()
{
        //模板设置为Person
    vector <Person>v;   //创建一个vector容器
    v.push_back(Person("zs",20));
    v.push_back(Person("ls",30));
    v.push_back(Person("ww",25));
    v.push_back(Person("zl",40));
    v.push_back(Person("dq",35));   //初始化vector 调用有参构造
    printVectorPerson(v);   //打印
}

容器嵌套容器

#include <vector>
void printVectorVector(vector <vector<int>> &vv)
{
    vector <vector<int>>::iterator it = vv.begin(); //创建外层迭代器
    //使用双循环打印 因为需要两重解引用
    while(it != vv.end())   //判断外层迭代器是否遍历完毕
    {
        vector <int>::iterator  iit = (*it).begin();    //创建内层迭代器
        while(iit != (*it).end())   //判断内层迭代器是否遍历完毕
        {
            cout<<*iit++<<" ";  //内层迭代器++
        }
        cout<<endl; //打印回车
        it++;   //外层迭代器++
    }
}

void test_01()
{
    vector <int>v1; //创建一个vector容器
    v1.push_back(1);
    v1.push_back(2);    //初始化vector
    v1.push_back(3);
    vector <int>v2;     //创建一个vector容器
    v2.push_back(10);
    v2.push_back(20);   //初始化vector
    v2.push_back(30);
    vector <int>v3;  //创建一个vector容器
    v3.push_back(100);
    v3.push_back(200);  //初始化vector
    v3.push_back(300);
        //将模板设置为vector<int>
    vector <vector<int>>v;  //创建一个可以存放vector的vector容器
    v.push_back(v1);    //将vector<int>类型的容器存入
    v.push_back(v2);
    v.push_back(v3);
    printVectorVector(v);   //打印
}

由于作者水平有限,内容纯手敲整理可能有误。

如果有哪些不足或者错误的地方,也希望大家督促我尽快改正哦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值