> 文章列表 > vector容器

vector容器

vector容器

1、vector简介

vector 和 arry 非常相似,唯一存在的不同是 vector 是动态分配内存空间,随着元素的增加空间自动增加,但是 arry 是静态的
wector:单端动态数组容器
vector容器

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;
} 

vector容器
vector容器

3、vector的构造函数

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;
} 

vector容器

4、vector的赋值操作

vector容器

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

5、vector大小操作

vector容器
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);//过大补50v6.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的增、删

vector容器

v1.pop_back();//尾删printVectorInt(v1);//10 200 30 300v1.insert( v1.begin()+2, 3, 500 );printVectorInt(v1);//10 200 500 500 500 30 300v1.erase(v1.begin()+2, v1.begin()+5 );printVectorInt(v1);//10 200 30 300v1.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 v3vector< 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 == intcout<<*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 == Personcout<<(*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);
}

vector容器