STL容器之vector

2022-10-10  本文已影响0人  二进制人类

单端动态数组

遍历输出

void printVectorInt(vector<int> &v)
{
    vector<int>::iterator it=v.begin();
    for(;it!=v.end();it++)
    {
        //*it==容器中的元素
        cout<<*it<<" ";
    }
    cout<<endl;
}

构造函数

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

实例

#include <iostream>
#include <vector>
using namespace std;

void test(){
    vector<int> v1(5,100);
    cout<<"size="<<v1.size()<<",容量="<<v1.capacity()<<endl;
    //size=5,容量=5
    //100 100 100 100 100
}

自动扩容机制

void test(){
    vector<int> v1;
    vector<int>::iterator it;
    int i=0;
    int count=0;
    for(i=0;i<1000;i++){
        v1.push_back(i);
        if(it != v1.begin()){
            count++;
            it=v1.begin();
            cout<<"第"<<count<<"次开辟了空间 容量为:"<<v1.capacity()<<endl;
        }
    }
}
/*
第1次开辟了空间 容量为:1
第2次开辟了空间 容量为:2
第3次开辟了空间 容量为:4
第4次开辟了空间 容量为:8
第5次开辟了空间 容量为:16
第6次开辟了空间 容量为:32
第7次开辟了空间 容量为:64
第8次开辟了空间 容量为:128
第9次开辟了空间 容量为:256
第10次开辟了空间 容量为:512
第11次开辟了空间 容量为:1024
*/

赋值操作

assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将 n 个 elem 拷贝赋值给本身。
vector& operator=(const vector &vec);//重载等号操作符
swap(vec);// 将 vec 与本身的元素互换
void test(){
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    printVectorInt(v1);//10 20 30 40 50

    vector<int> v2;
    v2.assign(v1.begin()+1,v1.end()-1);
    printVectorInt(v2);//20 30 40

    vector<int> v3;
    v3=v2;
    printVectorInt(v3);//20 30 40

    vector<int> v4(5,100);
    printVectorInt(v3);//20 30 40
    printVectorInt(v4);//100 100 100 100 100
    v3.swap(v4);
    printVectorInt(v3);//100 100 100 100 100
    printVectorInt(v4);//20 30 40
}

容量操作

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

实例

void test()
{
    vector<int> v1(5,100);
    //empty 返回true为空  false非空
    printVectorInt(v1);//100 100 100 100 100
    //重置的size 大于原来的size 多余的部分补0
    //v1.resize(10);
    //printVectorInt(v1);//100 100 100 100 100 0 0 0 0 0
    //重置的size 大于原来的size 多余的部分补2
    v1.resize(10, 2);
    printVectorInt(v1);//100 100 100 100 100 2 2 2 2 2
    //重置的size 小于原来的size 删除多余的部分
    v1.resize(3);
    printVectorInt(v1);//100 100 100
    vector<int> v2(10, 10);
    cout<<"size="<<v2.size()<<", capacity="<<v2.capacity()<<endl;//10 10
    v2.resize(100);
    cout<<"size="<<v2.size()<<", capacity="<<v2.capacity()<<endl;//100 100
    v2.resize(5);
    cout<<"size="<<v2.size()<<", capacity="<<v2.capacity()<<endl;//5 100
    
    vector<int> v3;
    //预留1000个元素
    v3.reserve(1000);
    cout<<v3.capacity()<<endl;
}

使用swap收缩空间

void test(){
 vector<int> v1;
    v1.reserve(1000);
    cout<<"size="<<v1.size()<<", 容量="<<v1.capacity()<<endl;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    cout<<"size="<<v1.size()<<", 容量="<<v1.capacity()<<endl;

    //收缩空间大小
    //v1.resize(5);//无法减少容量大小
    vector<int>(v1).swap(v1);
     cout<<"size="<<v1.size()<<", 容量="<<v1.capacity()<<endl;
}

数据存取

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

实例

void test()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);

    printVectorInt(v1);//10 20 30 40 50
    cout<<v1[2]<<" "<<v1.at(2)<<endl;//30 30
    cout<<"头元素:"<<v1.front()<<" 尾元素:"<<v1.back()<<endl;//10 50
}

数据插入删除

insert(const_iterator pos, int count,ele);//迭代器指向位置 pos 插入 count
个元素 ele.
push_back(ele); //尾部插入元素 ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从 start 到 en
d 之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素
void test()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    printVectorInt(v1);//10 20 30 40 50
    v1.insert(v1.begin()+2,3, 1000);
    printVectorInt(v1);//10 20 1000 1000 1000 30 40 50

    v1.pop_back();//尾部删除 一次删除一个元素
    v1.pop_back();//尾部删除 一次删除一个元素
    printVectorInt(v1);//10 20 1000 1000 1000 30

    v1.erase(v1.begin()+2, v1.begin()+5);
    printVectorInt(v1);//10 20 30

    //v1.clear();//容器全部清空
    v1.erase(v1.begin(), v1.end());
    printVectorInt(v1);//无数据
}

容器的嵌套

void test()
{
    vector<int> v1(5,100);
    vector<int> v2(3,30);
    vector<int> v3(10,10);
    vector<int> v4(6,50);

    vector<vector<int>> v;
    v.push_back(v1);
    v.push_back(v2);
    v.push_back(v3);
    v.push_back(v4);

    vector<vector<int>>::iterator it=v.begin();
    for(;it!=v.end();it++)
    {
        //*it的类型为vector<int>
        vector<int>::iterator mit=(*it).begin();
        for(;mit!=(*it).end();mit++)
        {
            //*mit==int
            cout<<*mit<<" ";
        }
        cout<<endl;
    }
}
/*
100 100 100 100 100
30 30 30
10 10 10 10 10 10 10 10 10 10
50 50 50 50 50 50
*/

存放自定数据

class Person
{
    friend void test11();
private:
    int num;
    string name;
    float score;
public:
    Person(){}
    Person(int num, string name, float score):num(num),name(name),score(score){}
};

void test()
{
    vector<Person> v;

    v.push_back(Person(100,"lucy", 88));
    v.push_back(Person(101,"bob", 99));
    v.push_back(Person(102,"tom", 77));
    v.push_back(Person(103,"wata", 66));

    vector<Person>::iterator it=v.begin();
    for(;it!=v.end();it++)
    {
        //(*it)==Person
        cout<<(*it).num<<" "<<(*it).name<<" "<<(*it).score<<endl;
    }
}
上一篇下一篇

猜你喜欢

热点阅读