vector容器

11 篇文章 2 订阅

1、vector简介

vector 和 arry 非常相似,唯一存在的不同是 vector 是动态分配内存空间,随着元素的增加空间自动增加,但是 arry 是静态的
wector:单端动态数组容器,只允许在一端进行操作
在这里插入图片描述

2、vector的使用

需要引进头文件

#include <vector>

vector是一个类模板,所以使用下面方式定义

 vector<int> v1;   //使用 <>表明类模板的数据类型

,使用尖括号表明元素的类型

定义迭代器:每一个容器对应唯一一个迭代器,保存的是容器的首元素位置,但是在 STL 中没有所谓的元素的地址一说

#include <iostream>
#include <vector>
using namespace std;
void test01()
{
    vector<int> v1;        //容器是一个模板类,需要指明容器中的数据类型 
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    
    //每一个容器有一个唯一的首元素地址也就是有一个唯一的迭代器 
    vector<int>::iterator it = v1.begin();          //使用begin保存元素的首地址,用于遍历容器中的各个元素
	for(;it!=v1.end();it++){
		cout<<*it<<endl;
	}
	return; 
}

int main(){
	test01();
	return 0;
} 

在这里插入图片描述
在这里插入图片描述

3、vector的构造函数

在这里插入图片描述

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

void test02(){
	vector<int> v(5,100);  //n个元相同元素的构造
	printVectorInt(v);
	vector<int> v1 = v;    //拷贝构造
	printVectorInt(v1);
	vector<int> v2(v1.begin(),v1.end());    //区间拷贝构造
	printVectorInt(v2);
}



int main(){
	test02();
	return 0;
} 

在这里插入图片描述

4、vector的赋值操作

在这里插入图片描述

vector<int> v3;               //重载的赋值运算符 
	v3 = v2;
	printVectorInt(v3);
	v3.assign(10,10);             //10个10 
	printVectorInt(v3);
	v3.swap(v2);                   //交换 v3 和 v2
	printVectorInt(v2);
	printVectorInt(v3);

5、vector大小操作

在这里插入图片描述
在这里插入图片描述
v6.resize(20,50)是过大补为 50,但是第一个是过大补为 0

 cout<<"大小:"<<v4.size()<<" 容量:"<<v4.capacity()<<endl;
    //容器是否为空
    vector<int> v5;
    if(v5.empty())
    {
        cout<<"空"<<endl;
    }
    else
    {
        cout<<"非空"<<endl;
    }

    vector<int> v6(10, 30);
    cout<<"大小:"<<v6.size()<<" 容量:"<<v6.capacity()<<endl;
    printVectorInt(v6);
    //v6.resize(20);//过大补0
    //v6.resize(20, 50);//过大补50
    v6.resize(32);
    cout<<"大小:"<<v6.size()<<" 容量:"<<v6.capacity()<<endl;
    printVectorInt(v6);

6、vector的存取操作

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

    cout<<"头元素:"<<v1.front()<<"   尾元素:"<<v1.back()<<endl;
    //at越界抛出异常  【】越界不会抛出异常
    cout<<v1.at(1)<<" "<<v1[1]<<endl;
    v1.at(1)=200;
    v1[3]=300;
    printVectorInt(v1);//10 200 30 300 50

6、vector的增、删

在这里插入图片描述

v1.pop_back();//尾删
    printVectorInt(v1);//10 200 30 300
    v1.insert( v1.begin()+2, 3, 500 );
    printVectorInt(v1);//10 200 500 500 500 30 300
    v1.erase(v1.begin()+2, v1.begin()+5 );
    printVectorInt(v1);//10 200 30 300
    v1.clear();
    cout<<"大小:"<<v1.size()<<" 容量:"<<v1.capacity()<<endl;

7、容器嵌套容器

void test05()
{
    vector<int> v1(5,10);
    vector<int> v2(5,100);
    vector<int> v3(5,1000);

    //需求:定义一个容器 存放v1 v2 v3
    vector< vector<int> > v;
    v.push_back(v1);
    v.push_back(v2);
    v.push_back(v3);

    //遍历
    vector< vector<int> >::iterator it;
    for(it=v.begin(); it!=v.end(); it++)
    {
        //*it == vector<int>
        vector<int>::iterator mit;
        for(mit=(*it).begin();mit!=(*it).end();mit++ )
        {
            //*mit == int
            cout<<*mit<<" ";
        }
        cout<<endl;
    }
}

8、使用算法对 vector 进行排序

#include<algorithm>//算法头文件
bool myCompare(int value1, int value2)      //自定义排序规则 
{
    return value1<value2;
}
void test06()
{
    vector<int> v1;
    v1.push_back(20);
    v1.push_back(60);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(40);
    v1.push_back(10);
    printVectorInt(v1);

    //sort算法排序,默认从小到大 
    sort(v1.begin(), v1.end());
    //sort(v1.begin(), v1.end(), greater<int>());  greater<int>是仿函数,提供排序策略 
    //sort(v1.begin(), v1.end(), myCompare);     myCompare是自定义排序规则 
    printVectorInt(v1);
}

9、vector存放自定义类型

class Person
{
    friend void printVectorPerson(vector<Person>  &v);
    friend bool myComparePerson(const Person &ob1,  const Person &ob2);
private:
    int num;
    string name;
    float score;
public:
    Person(){}
    Person(int num, string name, float score)
    {
        this->num = num;
        this->name = name;
        this->score = score;
    }
#if 0
    //方法2:重载自定义数据的<运算符
    bool operator<(const Person &ob)
    {
        return this->num < ob.num;
    }
#endif
};
void printVectorPerson(vector<Person>  &v)
{
    vector<Person>::iterator it;
    for(it=v.begin(); it!=v.end(); it++)
    {
        //*it == Person
        cout<<(*it).num<<" "<<(*it).name<<" "<<(*it).score<<endl;     //访问私有数据必须使用友元 
    }
}
//方法1:对于自定义容器排序 必须实现 排序规则
bool myComparePerson(const Person &ob1,  const Person &ob2)
{
    if(ob1.num == ob2.num)
        return ob1.score<ob2.score;
    return ob1.num > ob2.num;
}

void test07()
{
    vector<Person> v;

    v.push_back(Person(100, "lucy", 88.8f));
    v.push_back(Person(103, "bob", 99.8f));
    v.push_back(Person(103, "tom", 77.8f));
    v.push_back(Person(103, "德玛", 88.8f));
    v.push_back(Person(101, "小法", 66.8f));

    printVectorPerson(v);
    //方法1:对于自定义容器排序 必须实现 排序规则
    sort(v.begin(), v.end(), myComparePerson);
    //方法2:重载自定义数据的<运算符
    //sort(v.begin(), v.end());
    cout<<"--------------"<<endl;
    printVectorPerson(v);
}

在这里插入图片描述

10、vector的应用范围

vector只是单纯地保存数据,这些数据没有什么规律

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q渡劫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值