STL-vector的使用及相关函数讲解

1、什么是STL?

STL简介:STLStandard Template Library)标准模板库,是“容器”的集合。

2、STL核心类库的基本概念

容器(Containers)可容纳各种数据类型的数据结构(计算机存储、组织数据的方式)C++提供了各种不同类型的容器,比如dequelistvectormap等。 

迭代器(iterators可依次存取容器中元素的东西。比如数组int array[100]就是个容器,而int*类型的指针变量就可以作为迭代器,可以用来遍历容器的所有元素。

算法(Algorithms算法作用于容器。算法提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。例如,STLsort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。

STL内的所有组件都由模板(template)构成,其元素可以是任意类型。

STL容器:

常用顺序容器:vectordequelist

常用关联容器:setmap

容器适配器:stackqueuepriority_queue

STL算法:搜寻、排序、拷贝等

3、Vector

向量(Vector)是一个顺序容器(Sequence Container),它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组(元素个数可变)。

函数名

函数说明

push_back(元素)

增加一个元素到向量后面

Insert(位置,元素)

插入元素到向量的指定位置

Insert(位置,个数n,元素)

插入n个相同的元素到指定位置

Insert(位置,向量头指针first,尾指针end)

将另一个向量从first开始到end结束(不包括end)之间的内容插入该向量的指定位置

erase(位置)

删除指定位置的元素

pop_back()

弹出(删除)向量的最后一个元素

clear()

清除向量所有元素,size()变为0

运算符[i]

取向量下标为i的元素

front()

取向量第一个元素

back()

取向量最后一个元素

begin()

返回向量头指针(迭代器),指向第一个元素

end()

返回向量尾指针,指向向量最后一个元素的下一个位置

rbegin()

反向迭代器,指向最后一个元素

rend()

反向迭代器,指向第一个元素之前的位置

size()

返回向量中实际元素的个数

resize(大小)

重新设定向量的大小,也就是可以保存元素的个数

max_size()

得到Vector最大可以是多大

empty()

判断向量是否为空,等价于size()0

swap()

交换两个同类型向量的数据

 

对应于数组,要注意:向量的大小是可变的,开始时向量为空,随着不断插入元素,向量自动申请空间,容量变大。

注意学会使用:sort()、reverse()等函数对vector进行排序、逆序等操作。

例子:vector的存储和遍历

注意掌握vector构造的4个常见方法:

(1)vector():创建一个空vector

#include <bits/stdc++.h>
using namespace std;

void print(vector<int> v){
    for(int i=0;i<v.size();i++){
        //vector:可以使用下标访问,但不能越界 
        cout<<v[i]<<" ";
    } 
}

int main(){

//定义vector存储int类型的变量
    vector<int> v; 
    //size():获取vector存储元素的个数 
    cout<<v.size()<<endl;
    //注意:常见错误,vector<int> v定义一个空的vector,不可以用下标来存储或访问元素
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    cout<<v.size()<<endl;
    print(v);
    return 0;
}
View Code

(2)vector(n):创建一个元素个数为n的vector

(3)vector(n,t):创建一个元素个数为n且值为t的vector

(4)vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中

#include <bits/stdc++.h>
using namespace std;

void print(vector<int> v){
    for(int i=0;i<v.size();i++){
        //vector:可以使用下标访问,但不能越界 
        cout<<v[i]<<" ";
    } 
}

int main(){
    //定义方法1:
    //vector<int> v; 
    //定义方法2:定义一个长度为5的vector,默认值为0 
    //    vector<int> v(5);
    //定义方法3:定义长度为5的vector,默认值为80; 
    //vector<int> v(5,80);
    
    int a[]={10,20,30,40,50};
    //定义方法4:使用数组来初始化vector  
    //sizeof():计算变量占用的字节数
    cout<<sizeof(a)/sizeof(int)<<endl;  //计算数组中有多少个元素,即数组的实际长度 
    vector<int> v(a,a+sizeof(a)/sizeof(int));
    v.push_back(10);
     
    print(v);
    return 0;
}
View Code

例子:vector的插入、删除、获取头尾元素

#include <bits/stdc++.h>
using namespace std;

void print(vector<int> v){
    for(int i=0;i<v.size();i++){
        //vector:可以使用下标访问,但不能越界 
        cout<<v[i]<<" ";
    } 
}

int main(){

    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    //print(v);
    
    //insert(位置,元素):位置必须提供位置指针
    //向vector中下标为1的位置插入100; 
    //v.insert(v.begin()+1,100);
    //向vector中下标为1的位置,插入5个100
//    //v.insert(v.begin()+1,5,100) ;
//    vector<int> v2;
//    v2.push_back(100);
//    v2.push_back(200);
//    v2.push_back(300);
//    //把v2的三个元素插入到v中下标为1的位置
//    v.insert(v.begin()+1,v2.begin(),v2.end()) ;
//删除v中下标为1的元素 
//    v.erase(v.begin()+1);
//删除v中下标为1的元素 和之后的所有元素 
    v.erase(v.begin()+1,v.end());
    print(v); 
    return 0;
}
View Code

 例子:size()、resize()、swap()、sort()、reverse()函数

#include <bits/stdc++.h>
using namespace std;

void print(vector<int> v){
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
}

int main(){
    vector<int> v1;
//    v1.push_back(10);
//    v1.push_back(20);
//    
//    vector<int> v2;
//    v2.push_back(100);
//    v2.push_back(200);
//    v2.push_back(300);
//    
//    swap(v1,v2);
//    cout<<"v1"<<" ";
//    print(v1);
//    cout<<endl;
//    cout<<"v2"<<" ";
//    print(v2);
    int a[] = {5,3,1,4,2};
    vector<int> v(a,a+5);
    sort(v.begin(),v.end());
    print(v);
    reverse(v.begin(),v.end());
    print(v);
    //重置vector的大小为20 
    v.resize(20);
    print(v);
    return 0;
}

例子:二维vector

这里最外的<>要有空格,否则在比较旧的编译器下无法通过。

#include <bits/stdc++.h>
using namespace std;

int main(){
    //定义二维vector
    //外层>加一个空格,因为>>表示右移运算符 
    vector<vector<int> > v(20);
    for(int i=0; i<5;i++){
        for(int j=0;j<5;j++){
            v[i].push_back(i+j);
        }
    }
    
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            cout<<v[i][j]<<" ";
        }
        cout<<endl;
    }
    
    return 0;
}
View Code

 

猜你喜欢

转载自www.cnblogs.com/echo-lu/p/11878926.html