当前位置: 首页 > article >正文

C++ STL容器-Vector容器概念及应用方法详解

1. 概念

Vector可以翻译为向量,或向量数组,至于为什么以向量命名,可以理解为一维空间也是存在向量的。

Vector是最简单的序列是容器,就像数组一样,向量使用连续的存储位置作为元素,这意味着它们的元素也可以使用常量指向其元素的偏移来访问,与数组一样有效。但与数组不同,它们的大小可以动态变化,其存储由容器自动处理。

vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素.

在局部函数中开vector数组,是在堆空间里面开的,与开全局变量比较类似,所以经常见到在局部函数中开大容量数组

总结一下Vector就是一个动态创建空间,且预先加载了常用的数组操作的数组

2. 相关头文件

头文件:#include <vector>

3. 初始化

格式为:vector<Data_Types> name;

我们以Int类型作为参数为例,进行创建。//创建前一定会创建构造函数(名称与类一样)

构造函数:与类名完全相同,对初始对象赋值

析构函数:一定会被执行,当对象结束其生命周期,如对象所在的函数已调用完毕,系统自动执行析构函数,往往用来执行清理善后工作

vector<int> v1;          //创建一个空的向量v1
vector<int> v2(10);      //创建一个向量v2,其已开辟10个元素的空间,相当于int v[10];
vector<int> v3(10,5);    //创建一个向量v3,其已开辟10个元素的空间并全部赋值为5
vector<int> v4(v3.begin(),v3.end());    //创建一个向量v3,其内容为向量v3的内容
vector<int> v5(v4);      //创建一个向量v5,其包含了v4的全部内容

4. 迭代器

顾名思义,迭代器是一种安全的访问控制器,它本身是一种指针,用于直接的元素访问。其遍历访问的大致思路是,创建容器的迭代器,让迭代器指向第一个元素,逐步向后移动并最终指向最后一个元素结束。

遍历代码举例:

vector<int> v;       //创建一个向量vs
vector<int>::iterator it;   //C98标准,it是vector的迭代器,对迭代器作遍历
for(it=v.begin();it!=v.end();it++){
    cout<<*it<<' ';
}

当然,遍历也可以直接使用下标访问:

for(int i=0;i<v.size();i++){
        cout<<v[i]<<' ';
    }

请根据自己的使用习惯进行合理的安排,对于新手而言会更倾向于选择后者。

5.常用接口(常用的)

Vector的接口有非常多,不同的C++语言标准也不同,这里只提供一些常用的进行简介,具体的使用可以翻阅官方文档(英文),或是别人的翻译稿。

我们使用 vector<int> v; 预先创建了一个向量。

a. 向量尾插入push_back()

在向量的末尾添加一个新元素val,并自动让容器大小增大一个。

函数原型:

void push_back (const value_type& val);

使用举例:

v.push_back(10);  //插入一个数据10

b. 向量尾删除pop_back()

移除向量尾的最后一个元素,并且将容器大小减小一个,

函数原型:

void pop_back();

使用举例:

v.pop_back();

c. 插入insert()

插入元素到指定位置,通过在元素之前在指定位置插入新元素来扩展向量,从而有效地增加容器大小所插入的元素数量。

函数原型:

插入单一数据到指定位置:

*iterator insert (iterator position, const value_type& val);*

插入一段数据到指定位置:

*void insert (iterator position, size_type n, const value_type& val);*

插入一段别的容器的数据到指定位置:

*template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);*

使用举例:

v.insert(v.begin(),10);     //在向量最前端插入数据10
 v.insert(v.begin(),5,20);   //在向量最前端插入5个数据20
  
 vector<int> k(2,50);   //创建一个新的向量k,其拥有2个元素内容均为50
 v.insert(v.begin(),k.begin(),k.end());  //在向量v最前端插入向量K的全部内容

d. 删除erase()

删除一个元素,或者是一段区间的元素,将会自动缩减空间使用。

函数原型:

*iterator erase (iterator position);*
*iterator erase (iterator first, iterator last);*

使用举例

v.erase(v.begin());     //删除第一个元素
v.erase(v.begin(),v.begin()+4); //删除从第一个开始后4个元素(包括第一个)

e. 清空clear()

将向量中所有元素清空。

函数原型:

void clear();

使用举例:

v.clear();      //清空向量

f. 数据大小size()

返回向量中的数据元素个数。

函数原型:

size_type size() const;

使用举例:

g. 已开辟最大宽度capacity()

返回向量最大已开辟的空间大小。

函数原型:

size_type capacity() const;

使用举例

cout<<v.size()<<endl;   //输出5

h. 最大支持空间max_size()

返回计算机支持开辟vector的最大空间值,一般来说和计算机内存和CPU相关,是一个极大的数据,而且不同计算机中可能有不同的值

函数原型:

size_type max_size() const;

使用举例:

vector<int> v(5,10);    //创建默认有5个值为10的元素的向量v
cout<<v.max_size()<<endl;   //输出4611686018427387903

6. vector 示例

#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
    cout << "vector example:" << endl;//cout<< 输出,<<左移
    
    // 创建一个int类型向量 x
    vector<int> x; 

    // 创建一个包含100个元素的int类型向量 y
    vector<int> y(100);
    
    // 输出vector x的初始大小
    cout << "vector x size = " << x.size() <<endl;

    // 输出vector y的初始大小
    cout << "vector y size = " << y.size() <<endl;
    
    // 为向量x的前10个元素赋值
    for (int a = 0; a < 10; a++)
        x.push_back(a); // 在vector最后插入元素
    
    // 输出vector y扩展后的大小
    cout << "vector x size = " << x.size() <<endl;
 
    vector<int>::iterator p; // 使用迭代器访问 x 的值 
    cout << "all elements in x: ";
    for (p = x.begin(); p < x.end(); p++)
        cout << *p << " "; //依次输出每一个元素的值
    cout << endl;
    
    // 删除vector中第4个元素
    vector<int>::iterator pp = (x.begin()+3);
    cout << "before erase ";
    cout << "vector x[4] = " << *pp << endl; 
    x.erase(pp);
    cout << "after  erase ";
    cout << "vector x[4] = " << *pp << endl; 
    return 0;
}


http://www.kler.cn/news/292804.html

相关文章:

  • SSH免秘钥问题
  • 【netty系列-09】深入理解和解决tcp的粘包拆包
  • 一文讲清楚,AI、AGI、AIGC与AIGC、NLP、LLM,ChatGPT等概念
  • 【云计算】什么是云计算服务|为什么出现了云计算|云计算的服务模式
  • 动手学深度学习8.2. 文本预处理-笔记练习(PyTorch)
  • 计算机网络八股文之TCP协议
  • FPGA随记---inout端口的处理
  • 20240902软考架构-------软考101-105答案解析
  • TMC5271/TMC5272 支持使用编码器进行闭环位置控制
  • linux下NTP服务器实战(chrony软件)
  • 数学建模强化宝典(1)级比检验
  • VirtualBox Debian 自动安装脚本
  • Pytorch中不同的Norm归一化详细讲解
  • 后端开发刷题 | 最长公共子序列(非连续)
  • Qt放Element网页滑动菜单栏
  • Quartz.Net_快速开始
  • ​如何通过Kimi强化论文写作中的数据分析?
  • CommonJS与ESModule标准
  • 企业在选择CRM系统时需要注意哪些问题呼叫系统外呼系统部署搭建
  • FPGA第 9 篇,Verilog 中的关键字和基数
  • kuka6轴机器人配置外部启动信号(学习记录,可能不对)
  • Spring框架中的循环依赖详解以及解决方案
  • html初体验之hello world
  • 【前端面试】标记、绘画视频的某一帧
  • 微信小程序webgl 显示图片
  • 121.rk3399 uboot(2017.09) 源码分析1(2024-09-05)
  • Xilinx高速接口文档简介
  • 【机器人工具箱Robotics Toolbox开发笔记(七)】 创建机器人连杆对象
  • Docker in Docker 实践 on mac
  • 苹果手机之间如何互传文件?简单又高效的选择