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只是单纯地保存数据,这些数据没有什么规律