• c++ vector用法 入门必看 超详细


    1、vector的作用

    vector是最常用的容器之一,功能十分强大,可以储存、管理各种类型的数据。在很多情况下可以用来代替功能比较局限的普通数组,因为我们知道,普通数组只能实现一对一的映射而不能实现一对多的映射,vector就是专门为了解决这个问题而诞生的。vector也可以称为动态数组,因为其大小是根据实时更新而变化的,正因为如此vector显得更加灵活易用。

    举个例子
    小明拥有一根香蕉和两个苹果
    小芳拥有一根棒棒糖个三个梨
    那么你试着思考一下,应当如何在程序中表示这种结构呢?这就是一对多映射的例子,学完vector就可以轻松解决这个问题了。

    2、vector的定义

    vector<储存的类型> 容器名
    如:
    储存int型的值 vector v;
    储存double型的值 vector v;
    储存string型的值 vector v;
    储存结构体或者类的值的值 vector<结构体名> v;

    当然也可以定义vector数组:
    储存int型的值 vector v[n];
    储存double型的值 vector v[n];
    等等,n为数组的大小

    3、vector常用的成员函数

    //这些都是必会的成员函数
    size()//返回返回容器中元素个数
    begin()//返回头部迭代器
    end()//返回尾部+1迭代器
    rbegin()//返回逆首部迭代器
    rend()//返回逆尾部-1迭代器
    front()//返回首个元素
    back()//返回尾部元素
    push_back()//在末尾添加一个函数
    emplace_back()//和push_back()是一样的作用
    pop_back()//弹出最后一个元素
    empty()//判断是否为空
    insert()//在指定位置插入元素
    erase()//在指定位置删除元素
    clear()//清空容器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    详细解析:
    (1)size()
    size()是最常用的成员函数了,常用于vector的遍历和元素个数的查询

    (2)push_back()
    出了初始化以外,push_back()是vector最重要的修改函数了,复杂度为O(1),而insert()的复杂度为O(n),差距明显

    (3)front()、back()
    查询首元素和未元素,其实通过随机访问,v[0]、v[v.size()-1]是可以达到相同效果的,用front()和back()显得专业点

    (4)begin()、end()
    通常用来方便排序的,也可以用来遍历,但没必要,通过下标遍历更简单快捷,rbegin()、rend()则可以用来逆序排序

    (5)insert()
    insert (position, x );
    insert (position, n, x );
    insert (position, first, last );
    插入新的元素,
    第一个函数,在迭代器指定的位置前插入值为x的元素
    第二个函数,在迭代器指定的位置前插入n个值为x的元素
    第三个函数,在迭代器指定的位置前插入另外一个容器的一段序列迭代器first到last
    复杂度很高,迫不得已不使用

    (6)erase()
    erase ( position );
    erase (first, last );
    删除元素或一段序列
    同样地,复杂度很高,迫不得已不使用

    示例代码:

    #include//c++标准头文件,可以使用cout,cin等标准编译用法
    #include//使用vector时需要的头文件 
    #include//包含许多内置函数,如排序、倒置、交换等函数 
    using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
    //遍历函数 
    void print(auto v){
    	for(auto c:v){
    		cout<<c<<' ';
    	}
    	cout<<endl;
    }
    int main(){
    	vector<int> v;//定义一个 int型vector 
    	
    	v.emplace_back(3);
    	v.emplace_back(4);
    	v.emplace_back(1);
    	v.emplace_back(2);
    	cout<<"现在有的元素 :";
    	print(v);
    	cout<<endl;
    	
    	cout<<"v.front()="<<v.front()<<endl;
    	cout<<"v.back()="<<v.back()<<endl;
    	cout<<endl;
    	
    //	排序
    	sort(v.begin(),v.end());
    	cout<<"排序后 :";
    	print(v);
    	cout<<"v.front()="<<v.front()<<endl;
    	cout<<"v.back()="<<v.back()<<endl;
    	cout<<"v.size()="<<v.size()<<endl;
    	cout<<endl;
    	
    //	插入5、6 
    	v.insert(v.begin()+2,{5,6}); 
    	cout<<"插入5、6后: ";
    	print(v);
    	cout<<endl;
    	
    //	倒置
    	reverse(v.begin(),v.end());
    	cout<<"倒置后: ";
    	print(v);
    	cout<<endl;
    	
    //	逆序排序 
    	sort(v.rbegin(),v.rend());
    	cout<<"逆序排序后 :";
    	print(v);
    	
    //	判断是否为空
    	cout<<"v.empty()="<<v.empty()<<endl; 
    	cout<<"(v.size()==0)="<<(v.size()==0)<<endl;
    	cout<<endl;
    	
    	v.clear();
    	cout<<"v清空后"<<endl; 
    	cout<<"v.empty()="<<v.empty()<<endl; 
    	cout<<"(v.size()==0)="<<(v.size()==0)<<endl;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    4、vector的三种遍历方法

    (1)迭代器iterator

    代码:

    #include
    #include
    using namespace std;
    int main(){
    	vector<int> v;//定义 
    	v.emplace_back(1);//插入元素1 
    	v.emplace_back(3);//插入元素3
    	v.emplace_back(2);//插入元素2
    	vector<int>::iterator it;//使用迭代器
    	for(it=v.begin();it!=v.end();it++){
    		cout<<*it<<' ';
    	} 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果:

    1 3 2
    
    • 1

    (2)下标遍历

    代码:

    #include
    #include
    using namespace std;
    int main(){
    	vector<int> v;//定义 
    	v.emplace_back(1);//插入元素1 
    	v.emplace_back(3);//插入元素3
    	v.emplace_back(2);//插入元素2
    	for(int i=0;i<v.size();i++){
    		cout<<v[i]<<' ';
    	}
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果:

    1 3 2
    
    • 1

    (3)foreach遍历

    代码:

    #include
    #include
    using namespace std;
    int main(){
    	vector<int> v;//定义 
    	v.emplace_back(1);//插入元素1 
    	v.emplace_back(3);//插入元素3
    	v.emplace_back(2);//插入元素2
    	for(int c:v){
    		cout<<c<<' ';
    	}
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果:

    1 3 2
    
    • 1

    两种逆序遍历:
    代码:

    #include
    #include
    using namespace std;
    int main(){
    	vector<int> v;//定义 
    	v.emplace_back(1);//插入元素1 
    	v.emplace_back(3);//插入元素3
    	v.emplace_back(2);//插入元素2
    	
    //	迭代器法 
    	vector<int>::reverse_iterator it;//使用迭代器
    	for(it=v.rbegin();it!=v.rend();it++){
    		cout<<*it<<' ';
    	} 
    	cout<<endl;
    	
    //	下标遍历法
    	for(int i=v.size()-1;i>=0;i--){
    		cout<<v[i]<<' ';
    	} 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行结果:

    2 3 1
    2 3 1
    
    • 1
    • 2

    foreach虽然简单易用,但是不支持逆序遍历

    有小伙伴发现dev不能编译部分代码,那是因为dev还未支持c++11,可以看这篇文章解决
    dev使用c++11教程

    是不是很简单呢?

    刚接触肯定会觉得难,多些做题多些用,熟悉了就容易了,兄弟萌,加油!!!

    文章尚有不足,欢迎大牛们指正

    感谢观看,点个赞吧

  • 相关阅读:
    k8skubectl陈述式及声明式资源管理及金丝雀部署
    MySQL - 普通索引
    重新定义分析 - EventBridge 实时事件分析平台发布
    web课程设计网页规划与设计 基于HTML+CSS+JavaScript制作智能停车系统公司网站静态模板
    【科普知识】什么是模拟量控制?
    RunLoop小白入门
    SpringMVC04之JSON和全局异常处理
    RabbitMq:什么是RabbitMq? ①
    拼多多item_get_app - 根据ID取商品详情原数据
    手动实现第一个Servlet程序
  • 原文地址:https://blog.csdn.net/weixin_52115456/article/details/126024253