vector容器
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 和 v2printVectorInt(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);//过大补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的增、删
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);
}