首页 > 其他分享 >vector的特性及使用

vector的特性及使用

时间:2024-06-18 18:58:58浏览次数:24  
标签:begin cout iterator 元素 特性 插入 vector 使用

1、 vector的定义:

单独定义一个vector的形式为:

vector<typename>vector;

 1.如上定义其实相当于一个大小可变化的序列容器,即变长数组。

2.vector采用连续的储存空间来储存元素,意味着可以通过下标来访问元素,和数组一样高效,但是又比数组更优秀,它的大小是可以动态改变的,而且它的大小是可以由自身改变的,不用手动扩容。

3.与其他的动态序列容器相比(deque,list等),vector在访问元素的时候更加便利,在头尾添加和删除元素的效率更高,但是对于其他不在于末尾的删除和插入操作,效率更低。

4.本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小

 

 2.vector接口函数的使用

 

1、vector初始化

1】使用花括号直接赋值

vector<int> v{1,2,3,4,5}; 

2】使用圆括号赋值

vector<int> v(5);//初始化为5个值为0的元素 

 2、vector容器元素的访问

1】通过下标访问

定义为vector<int> v的容器,可以通过下标,v[0],v[1],v[2]......等的方式访问元素,下标的范围是0-v.size()-1;

2】通过迭代器访问

迭代器可以理解为类似原生指针的东西

vector<typename>::iterator  it;

可以通过对类似于指针的迭代器解引用的方式来达到访问元素的目的。

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v{ 1,2,3,4,5 };
    vector<int> ::iterator it = v.begin();
    while (it != v.end())
    {
        cout << *it << " ";
        it++;
}
    return 0;
}

 3、vector元素的插入操作:push_back()

 在元素的末尾插入一个元素x,时间复杂度为o(1);

    vector<int> v{ 1,2,3,4,5 };
    vector<int> ::iterator it = v.begin();
    v.push_back(6);
    for (auto e : v)
    {
        cout << e << " ";
    }
    cout << endl;

4、尾部删除操作:pop_back() 

删除末尾的一个元素,时间复杂度为o(1);

    vector<int> v{ 1,2,3,4,5 };
    vector<int> ::iterator it = v.begin();
    v.pop_back();
    for (auto e : v)
    {
        cout << e << " ";
    }
    cout << endl;


 5.获得元素个数:size()

 size()用于获取vector容器的元素个数,其返回值为size_t,时间复杂度为o(1)

vector<int> v{ 1,2,3,4,5 };
cout << v.size() << endl;

 6.插入操作:insert()(重要!!!)

参见cplusplus定义:

single element (1)
iterator insert (iterator position, const value_type& val);//从索引pos位置插入一个类型为value_type的元素val
fill (2)
    void insert (iterator position, size_type n, const value_type& val);//从索引pos位置开始插入n个类型为value_type的元素val
range (3)
template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);//从索引迭代器pos位置开始插入一个值区间。

 

    vector<int> v{ 1,2,3,4,5 };
    vector<int> v2{ 7,8,9 };
    v.insert(v.begin() + 2, 1);
    //在3的位置前插入一个1,{1,2,1,3,4,5};
    for (auto e : v)
        cout << e << " ";
    cout << endl;
    v.insert(v.begin() + 4, 3, 7);
    for (auto e : v)
        cout << e << " ";
    cout << endl;
    //在4的位置开始插入3个7;{1,2,1,3,1,7,7,7,4,5};
    v.insert(v.begin() + 2, v2.begin(), v2.end());
    //从3的位置前开始插入v2.的一个区间{1,2,7,8,9,1,3,1,7,7,7,4,5};
        for (auto e : v)
            cout << e << " ";
    cout << endl;

7.删除操作:erase()

 

iterator erase (iterator position);//删除pos位置的元素
iterator erase (iterator first, iterator last);//删除一个区间

     vector<int> v{ 1,2,3,4,5 };
    v.erase(v.begin() + 1);
    //删除2 -》{1,3,4,5};
    for (auto e : v)
    cout << e << " ";
cout << endl;
vector<int>::iterator it = v.begin();
vector<int>::iterator it1 = it+2;
v.erase(it, it1);
//删除v[0]-v[2] ->{4,5};
for (auto e : v)
    cout << e << " ";
cout << endl;

标签:begin,cout,iterator,元素,特性,插入,vector,使用
From: https://blog.csdn.net/2302_79215415/article/details/139755265

相关文章

  • python系列:使用Python快速读取PDF中的表单数据以及error处理
    使用Python快速读取PDF中的表单数据以及error处理使用Python快速读取PDF中的表单数据安装PythonPDF库Python读取PDF表单数据1、一次性读取多种PDF表单的数据2、读取特定PDF表单的数据python读取PDF文件中文本、表格、图片python读取PDF文件中文本、表格、图片一、文本......
  • 使用芯片为ZYNQ—7020,基于野火FPGA ZYNQ开发板
    使用芯片为ZYNQ—7020,基于野火FPGAZYNQ开发板肤色模型简介YCrCb也称为YUV,主要用于优化彩色视频信号的传输。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”......
  • springboot 使用 doris-streamloader 到doris 防止批量更新 事务卡主
    背景:使用mybatis批量实时和更新doris时经常出现连接不上的错误,导致kafka死信队列堆积很多滞后消费https://doris.apache.org/zh-CN/docs/2.0/ecosystem/doris-streamloader/packagecom.jiaoda.sentiment.data.etl.service.update;importcn.hutool.core.text.CharSequenc......
  • 使用volta管理前端开发环境
    背景:公司有新老不同的产品,使用的node版本不一样,每次都要手动切换node版本,对应的项目才能运行。这样很麻烦,有没有好的解决方法,就找到了volta。1.为什么是volta?管网介绍:使用Volta,一旦您选择了Node引擎,您就不必担心它。切换项目不需要您手动切换版本。跨平台支持,包括W......
  • 学习docker过程中,经常使用的命令
    常用命令:dockerps-a//查看正在运行的容器dockerps-all//查看所有的容器(包括正在运行的和已经停止的)dockerimages//列出所有镜像dockerexec-itmsb-mysql/bin/bash进入到容器中dockerrmcontainer_name_or_id//删除容器dockerrestartmsb-mysql-master//重启......
  • Vue3鼠标悬浮个人头像时出现修改头像,点击出现弹框,上传头像使用cropperjs可裁剪预览
    实现效果:鼠标悬浮到头像上,下方出现修改头像点击修改头像出现弹框,弹框中可上传头像,并支持头像的裁剪及预览 实现方式: 1.tempalte中<divclass="img-box"> <imgv-if="avatarImgUrl":src="avatarImgUrl"class="avatar"/> <divclass="text"@......
  • 【ai】如何在ollama中随意使用hugging face上的gguf开源模型
    【背景】ollama的pull命令可以直接pullollama列表中现有的模型,但是ollama可以直接pull的模型大都是英语偏好(llama2有直接可以pull的chinese版本),而huggingface上则有大量多语种训练的模型,如果能直接使用huggingface上的gguf开源模型,那就自由多了,本篇介绍方法。【命令】......
  • forest简单使用
    相对比restTemplate,forest形式和feign类似,接口调用清晰明了<dependency><groupId>com.dtflys.forest</groupId><artifactId>forest-spring-boot-starter</artifactId><version>1.5.36</version></dependency>......
  • k8s使用rbd作为存储
    k8s使用rbd作为存储如果需要使用rbd作为后端存储的话,需要先安装ceph-common需要提前在ceph集群上创建pool,然后创建image[root@ceph01~]#cephosdpoolcreatepool01[root@ceph01~]#cephosdpoolapplicationenablepool01rbd[root@ceph01~]#rbdpoolinitpool01[......
  • 代码随想录第四十一天 | 59.斐波那契数列,70.爬楼梯,71.使用最小花费爬楼梯
     59.斐波那契数列看完想法:虽然是最简单的动态规划问题,但还是要按照五部曲来分析intfib(intn){if(n<=1)returnn;vector<int>dp(n+1);//用n+1的原因是,定义数组时这个意思是数组的长度,n+1的话最后一个就是dp[n]dp[0]=0;......