• 27.【C/C++ 最全vector数组的用法 (详解)】


    vector动态数组

    (一)、什么是vector?

    Vector类 是在 java 中可以实现自动增长的对象数组,vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。

    (二)、vector的作用是什么

    vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。[1]

    (三)、经典用法:

    1.vector函数的定义:

    代码展示:
    #include 
    using namespace std;
    int main()
    {
        int a[10];            //正常定义      
        vector<int> str_a;    //vector 定义
        char b[10];
        vector<char> str_b;
        float c[10];
        vector<float> str_c;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    效果展示:

    在这里插入图片描述

    2.vector的初始化:

    1.vector<数据类型> 函数名; 初始化为空

    2.vector<数据类型> 函数名(a,b).定义a个空间,都初始化为b。

    3.vector<数据类型> 函数名1=函数名2. 把动态数组2复制给动态数组1。

    4.vector<数据类型> 函数名1(函数名2.begin(),函数名2.end()). 把动态数组2复制给动态数组1。

    5.vector<数据类型> 函数名(a,a+sizeof(a)/sizeof(数据类型)),把普通数组a复制给动态数组。

    ==========================================

    代码展示:
    #include 
    using namespace std;
    int main()
    {
     int a[5] = {1,2,3,4,5};
     vector<int> str_a; //初始化为空  
     vector<int> str_a1(4, 88); // 定义四个元素,每个元素的值为88;
     vector<int> str_a2 = str_a1; //把a1的值复制给a2;
     vector<int> str_a3(str_a1.begin(), str_a1.end()); //把a1的值复制给a2;
     vector<int> str_a4(a, a + sizeof(a)/sizeof(int)); //复制正常数组的初始化
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    效果展示:

    在这里插入图片描述

    3.vector的简单属性

    1.【动态数组的访问下标】

    函数名[n],   n就是访问第几个元素
    
    • 1

    2.【动态数组的访问at函数】

    函数名.at(n),   n就是访问第几个元素
    
    • 1

    3.【动态数组的长度】

    函数名.size(),     获取长度
    
    • 1

    4.【获取动态数组第一个元素】

    函数名.front()
    
    • 1

    5.【获取动态数组最后一个元素】

    函数名.back()
    
    • 1

    6.【判断动态数组是否为空】

    函数名.empty()    ,假如是返回true.
    
    • 1

    7.【动态数组的交换】

    函数名1.swap(函数名2)    把俩函数的内容交换
    
    • 1

    8.【动态数组元素的清空】

    	函数名.clear()
    
    • 1

    ====================================

    代码展示:
    #include 
    #include 
    using namespace std;
    int main()
    {
     int a[5] = {1,2,3,4,5};
     vector<int> str_a; //初始化为空  
     vector<int> str_a1(4, 88); // 定义四个元素,每个元素的值为88;
     vector<int> str_a2 = str_a1; //把a1的值复制给a2;
     vector<int> str_a3(str_a1.begin(), str_a1.end()); //把a1的值复制给a2;
     vector<int> str_a4(a, a + sizeof(a)/sizeof(int)); //复制正常数组的初始化
     int a5 = str_a4[2]; //vector 动态数组的访问,用下标
     int b = str_a4.at(2); // 利用at函数,也就是下下标
     cout << "a=" << a5 << " " << "b=" << b << endl;
     cout << "str_a4的长度为:" << str_a4.size() << endl; //获取长度,
     cout << "str_a4的第一个元素为:" << str_a4.front() << endl; // 获取第一个元素
     cout << "str_a4的第一个元素为:" << str_a4.back() << endl; //获取最后一个元素
     bool p = str_a4.empty(); //判断是否为空
     str_a4.swap(str_a1);
     //str_a4.clear(); //对数组元素清空
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    效果展示:

    在这里插入图片描述
    在这里插入图片描述

    4.vector的插入与删除

    1.【单尾部插入】

    函数名.push_back(a),    向尾部插入一个元素a,只能一个个插入,且只能在尾部。
    
    • 1

    2.【多元插入】 从哪插 插什么

    函数名1.insert(函数名1.begin(),a),   向头部插入一个元素a.
    
    函数名1.insert(函数名1.end(),n,a),向尾部插入n个元素 a.
    
    • 1
    • 2
    • 3

    3.【普通数组插入动态数组】

    	函数名1.insert(函数名1.begin(),普数组名,普数组名+sizeof(普数组名)
    	/sizeof(函数类	型))
    
    	从哪开始  普通数组首位置,普通数组末位置
    
    • 1
    • 2
    • 3
    • 4

    4.【单尾部删除元素】

    函数名.pop_back()     删除最后一个元素
    
    • 1

    5.【多元删除】

    	函数名.(函数名.begin(),函数名.begin()+n)
    
    	 从哪开始,删除几个.(只能是begin 和end不能换成数字)
    
    • 1
    • 2
    • 3

    6.vector的遍历(for)

      for (int i = 0; i < 函数名.size(); i++) //遍历
     {
      cout << 函数名[i] << " ";
     }
    
    • 1
    • 2
    • 3
    • 4

    7.【迭代遍历】

    vector<函数类型>::iterator itor;   
     for (itor = 函数名.begin(); itor != 函数名.end(); itor++)
     {
      cout << *itor << " ";
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ====================================

    代码展示:
    #include 
    #include 
    using namespace std;
    int main()
    {
     int a[20] = {1,2,3,4,5};
     vector<int> str_a; //初始化为空  
     vector<int> str_a1(4, 88); // 定义四个元素,每个元素的值为88;
     vector<int> str_a4(a, a + sizeof(a)/sizeof(int)); //复制正常数组的初始化
     int a5 = str_a4[2]; //vector 动态数组的访问,用下标
     int b = str_a4.at(2); // 利用at函数,也就是下下标
     cout << "a=" << a5 << " " << "b=" << b << endl;
     cout << "str_a4的长度为:" << str_a4.size() << endl; //获取长度,
     cout << "str_a4的第一个元素为:" << str_a4.front() << endl; // 获取第一个元素
     cout << "str_a4的第一个元素为:" << str_a4.back() << endl; //获取最后一个元素
     bool p = str_a4.empty(); //判断是否为空
     str_a4.swap(str_a1);
     str_a4.push_back(100); // 只能向尾部插入元素. 一个一个插入
     //str_a.clear(); //对数组元素清空
     str_a4.insert(str_a4.begin(), 888); // 从哪插入, 插入什么元素
     str_a4.insert(str_a4.begin(),3,888); // 从哪插入, 插入几个 插入什么元素
     int szint1[] = { 12,13,45 };
     str_a4.insert(str_a4.end(), szint1, szint1 + sizeof(szint1) / sizeof(int));
     //str_a4.pop_back(); //删除最后一个元素; 一个一个删除
     //str_a4.erase(str_a4.begin(), str_a4.begin()+2); // 从哪开始, 删除几个
     //str_a4.erase(str_a4.begin(), str_a4.end());  
     for (int i = 0; i < str_a4.size(); i++) //遍历
     {
      cout << str_a4[i] << " ";
     }
     vector<int>::iterator itor; //迭代器遍历 
     for (itor = str_a4.begin(); itor != str_a4.end(); itor++)
     {
      cout << *itor << " ";
     }
     return 0;
    }
    
    • 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
    效果展示:

    在这里插入图片描述
    在这里插入图片描述

    (四)、实战项目

    在这里插入图片描述

    代码展示:

    1.第一个经典列题:(课堂刷题的删除与插入)

    主要思路:我们要知道各个性质的关系,然后进行调用.

    #include 
    #include 
    using namespace std;
    int main()
    {
     vector<int> str_a(13);
     for (int i = 0; i < 13; i++)
     {
      cout << "请输入第" << i + 1 << "个数为:" << endl;
      cin >> str_a[i];
     }
     for (int j = 0; j < 13; j++)
     {
      if (str_a[j] == 3)
      {
       str_a.erase(str_a.begin() + j, str_a.begin() + j);
      }
      else
      {
       cout << str_a[j] << " ";
      }
     }
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    效果展示:

    在这里插入图片描述

    2.第二个经典列题:(进行两个整形数组合并的问题)

    主要思路:首先我们要分析问题得出,题目是要得到两个数组得合并,然后得知vector动态数组恰好有一个特点就是可以根据我们的需求进行变化,我们抓住这一点开始深入调查。创建两个动态数组,然后对数组1进行赋值,再把数组1的值复制给数组二,再创建临时元素,运用push_back()向尾部插入元素的性子,进行插入合并,最后通过for动态遍历.

    代码展示:
    #include 
    #include     //  vectoe动态数组的头文件
    using namespace std;
    int main()
    {
    	int n,m;
    	cout << "请您输入第一个元素数组的个数:" << endl;
    	cin >> n;
    	vector<int> str_int1(n);
    	for (int i = 0; i < str_int1.size(); i++)   //对动态数组一进行动态输入
    	{
    		cout << "请输入动态数组1第" << i + 1 << "个元素:" << endl;
    		cin >> str_int1[i];
    	}
    	cout << "请输入第二个数组的元素个数:" << endl;
    	cin >> m;
    	vector<int> str_int2(str_int1);  //把动态数组1复制给动态数组2
    	for (int j = 0; j < m; j++)
    	{
    		cout << "请输入动态数组2第" << j+ 1 << "个元素:" << endl;
    		int temp;             
    		cin >> temp;              //动态数组2的元素
    		str_int2.push_back(temp);      //把动态数组2的元素插入数组2
    	}
    	cout << "两个整型数组合并后为:" << endl;
    	for (int k = 0; k < m + n; k++)
    	{
    		cout << str_int2[k] << " ";
    	}
    	return 0;
    
    }
    
    • 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
    效果展示:

    在这里插入图片描述

  • 相关阅读:
    基础练习 字母图形
    详细总结快慢指针的在链表中的常见题型
    飞天诚信:CRM与战略同行,管理精度提升30%
    记一次web登录通杀渗透测试
    forest--声明式HTTP客户端框架-spring-b oot项目整合
    MySQL单机应用的性能优化
    Android 开发——环境搭建
    一种基于屏幕分辨率的RTSP主子码流切换的多路视频监控的播放方案
    MyBatis:枚举类型与字符串比较
    (新)Spring Security如何实现跨域
  • 原文地址:https://blog.csdn.net/qq_69683957/article/details/126364755