STL在C++中起到非常重要的作用,最大的好处就是将常见的数据结构进行了封装,使得我们不需要从底层一步步去实现,使用起来非常方便。C++知识小屋的STL系列旨在将常见STL库的常见函数进行小结,以函数+示例+结果展示的方式作为文章的整体结构。希望能够在用到这些库的时候能够快速上手,熟练地使用它们来解决一些常见的问题。
vector可以简单理解为是一个动态扩容的数组,如果我们事先无法知道数组的大小,数组的大小是随机变化的话,一般的做法是创建一个空间很大的数组,但是这种方法很费空间,此时使用vector则非常好。
同其他STL库一样,vector内部也包含了非常多的函数,而我们最常用的无非就是下面几种方法:
在程序中,我们需要包含下面的vector库,才能正常使用vector:
#include
下面列举了四种vector对象的构造方法,分别为:
1.无参构造函数
2. 有参构造函数(自己指明空间大小,默认初始化值为0)
3. 有参构造函数(自己设置空间大小和初始化值)
4. 拷贝构造函数(用另一个vector对象初始化当前对象)
其中我们最常用的方法为无参构造函数,即直接写一个对象名即可。但由于vector可以动态扩容,即当当前空间不足的时候,会创建一个更大的空间,然后把当前空间的值拷贝过去,这个过程是很费时间的,因此如果我们在初始化的时候预估具体情况指明空间大小,尽可能减少扩容的次数,则能提高vector的效率。
我们需要指明vector的对象类型,比如下面的例子我使用的是int类型,当然也可以指定为自定义的类型。
下面我们使用的是迭代器的方式遍历vector对象的元素,迭代器的定义格式如下图。
#include
#include
using namespace std;
int main(){
/******************构造vector对象*******************/
//第一种构造方法(无参数,默认为空)
vector<int> A;
cout << "第一种构造方法: " << endl;
for(vector<int>::iterator it = A.begin();it!=A.end();it++){
cout << char(*it) << " "; //若不加上char,则会输出数字
}
cout << endl << endl;
//第二种构造方法(参数1:指定容器的大小 ; 参数2:指定元素的初始化值 )
vector<int> B(5,'P');
cout << "第二种构造方法: " << endl;
for(vector<int>::iterator it = B.begin();it!=B.end();it++){
cout << char(*it) << " "; //若不加上char,则会输出数字
}
cout << endl << endl;
//第三种构造方法(参数1:指定容器的大小,且初始化值默认为0)
vector<int> C(5);
cout << "第三种构造方法: " << endl;
for(vector<int>::iterator it = C.begin();it!=C.end();it++){
cout << *it << " ";
}
cout << endl << endl;
/*第四种构造方法(复制构造函数:指定A中的某个区间作为C的元素,注意是左闭右开的原则,
最后一个元素不包含,即下面的构造函数包含只有两个元素) */
vector<int> D(B.begin()+1, B.begin()+3);
cout << "第四种构造方法: " << endl;
for(vector<int>::iterator it = D.begin();it!=D.end();it++){
cout << char(*it) << " ";
}
cout << endl << endl;
return 0;
}
#include
#include
using namespace std;
int main(){
vector<int> A;
cout << "A是否为空(0:不为空 1:为空):";
cout << A.empty() << endl;
A.push_back(1);
cout << "A是否为空(0:不为空 1:为空):";
cout << A.empty() << endl;
A.clear();
cout << "A是否为空(0:不为空 1:为空):";
cout << A.empty() << endl;
return 0;
}
#include
#include
using namespace std;
int main(){
vector<int> A; //创建对象
for(int i=1;i<4;i++){
A.push_back(i); //添加元素
}
for(vector<int>::iterator it = A.begin();it!=A.end();it++){
cout << *it << " ";
}
cout << endl << endl;
A.pop_back(); //删除一个末尾元素
for(vector<int>::iterator it = A.begin();it!=A.end();it++){
cout << *it << " ";
}
cout << endl << endl;
return 0;
}
#include
#include
using namespace std;
int main(){
vector<int> A; //创建对象
for(int i=1;i<4;i++){
A.push_back(i); //添加元素
}
for(vector<int>::iterator it = A.begin();it!=A.end();it++){
cout << *it << " ";
}
cout << endl << endl;
cout << "下标访问: " << A[0] << " " << A[1] << " " << A[2] << endl;
cout << "at函数访问: " << A.at(0) << " " << A.at(1) << " " << A.at(2) << endl;
return 0;
}
#include
#include
using namespace std;
int main(){
vector<int> A; //创建对象
for(int i=1;i<4;i++){
A.push_back(i); //添加元素
}
for(vector<int>::iterator it = A.begin();it!=A.end();it++){
cout << *it << " ";
}
cout << endl << endl;
A.insert(A.begin(),100); //在第一个元素前插入100
A.insert(A.end(),200); //在最后一个元素后一个位置的前面插入200(A.end()-1才表示最后一个元素)
cout<< "插入元素后的情况:" ;
for(vector<int>::iterator it = A.begin();it!=A.end();it++){
cout << *it << " ";
}
cout << endl << endl;
A.erase(A.begin()); //删除第一个元素
A.erase(A.end()-1); //减去1才表示最后一个元素,否则删除A.end会报错
cout<< "删除元素后的情况:" ;
for(vector<int>::iterator it = A.begin();it!=A.end();it++){
cout << *it << " ";
}
cout << endl << endl;
return 0;
}
#include
#include
using namespace std;
int main(){
vector<int> A; //创建对象
for(int i=1;i<4;i++){
A.push_back(i); //添加元素
}
//使用数组一样的方式进行访问
for(int i=0;i<A.size();i++){
cout << A[i] << " ";
}
cout << endl << endl;
return 0;
}
#include
#include
#include
#include
using namespace std;
int main(){
vector<int> A; //创建对象
for(int i=1;i<4;i++){
A.push_back(i); //添加元素
}
//使用数组一样的方式进性访问
cout << "原来的vector:" ;
for(int i=0;i<A.size();i++){
cout << A[i] << " ";
}
cout << endl << endl;
reverse(A.begin(),A.end()); //对A进行反转
cout << "反转后的vector:" ;
for(int i=0;i<A.size();i++){
cout << A[i] << " ";
}
cout << endl << endl;
return 0;
}
#include
#include
#include
using namespace std;
//自定义降序排序函数
bool cmp(const int &a,const int &b){
return a > b;
}
int main(){
vector<int> A; //创建对象
for(int i=1;i<4;i++){
A.push_back(i); //添加元素
}
//使用数组一样的方式进性访问
cout << "原来的vector:" ;
for(int i=0;i<A.size();i++){
cout << A[i] << " ";
}
cout << endl << endl;
//对A进行cmp方式的降序排序
sort(A.begin(),A.end(),cmp);
cout << "降序排序后的vector:" ;
for(int i=0;i<A.size();i++){
cout << A[i] << " ";
}
cout << endl << endl;
return 0;
}
vector<vector<int> >A;
#include
#include
using namespace std;
int main(){
//构造对象A (后面的两个'>'中间一定要有空格,否则会报错)
vector<vector<int> >A;
//输入二维数组的两个维度的值
int m,n;
cout << "请输入两个维度的值" << endl;
cin >> m >> n;
//构造A的大小
A.resize(m);
for(int i=0;i<A.size();i++){
A[i].resize(n);
}
//输入A中的每一个元素
cout << endl << "请输入每一个元素值: " << endl;
for(int i=0;i<A.size();i++){
for(int j=0;j<A[i].size();j++){
cin >> A[i][j] ;
}
}
//输出A中的每一个元素
cout << endl << "下面输出A的值: " << endl;
for(int i=0;i<A.size();i++){
for(int j=0;j<A[i].size();j++){
cout << A[i][j] << " ";
}
cout << endl;
}
return 0;
}
countf_if(A.begin(),A.end(),cmp) :表示在vector A对象中判断有多少个元素符合cmp条件,返回的是符合条件的个数。
bool cmp(Point A) {
return A.x > 80;
}
#include
#include
#include
using namespace std;
class Point{
public:
//两种变量x,y
int x,y;
//二合一的构造函数
Point(int _x=0,int _y=0){
x = _x;
y = _y;
}
//重载小于函数,用于sort排序
friend bool operator < (const Point & A,const Point & B){
if(A.x != B.x){
return A.x < B.x;
}
return A.y < B.y;
}
//重载输出流
friend ostream & operator << (ostream & o,const Point & A){
o << A.x << " " << A.y << endl;
return o;
}
};
//定义count_if的选择条件为x大于80
bool cmp(Point A) {
return A.x > 80;
}
int main(){
vector<Point> A; //创建对象以及输入数据
A.push_back(Point(85,25));
A.push_back(Point(95,60));
A.push_back(Point(85,50));
A.push_back(Point(60,40));
//使用数组一样的方式进性访问
cout << "原来的vector:" << endl;
for(int i=0;i<A.size();i++){
cout << A[i] ;
}
cout << endl << endl;
//对A进行排序
sort(A.begin(),A.end());
cout << "排序后的vector(先按x小的在前,再按y小的在前)" << endl;
for(int i=0;i<A.size();i++){
cout << A[i] ;
}
cout << endl << endl;
//用cmp的原则筛选符合条件的元素的个数大小
int num = count_if(A.begin(),A.end(),cmp);
cout << "符合 x>80 的个数有 :" << num << endl;
return 0;
}
上面展示了我认为比较常用的vector的方法,如果后面发现一些其他的常用方法的话,以后会进行补充的,也欢迎大家在评论区说说vector的一些常用方法噢!