首页 > 其他分享 >【数据结构】vector用法

【数据结构】vector用法

时间:2023-08-01 10:11:21浏览次数:34  
标签:vA begin end 迭代 元素 用法 vector 数据结构

1.初始化:

vector<类型>标识符
vector<类型>标识符(最大容量)
vector<类型>标识符(最大容量,初始所有值)
 
int i[5]={1,2,3,4,5}
vector<类型>vi(i,i+2);//得到i索引值为3以后的值
 
vector<vector<int>>v; 二维向量//这里最外的<>要有空格。否则在比较旧的编译器下无法通过

2.常用函数

push_back()  //在数组的最后添加一个数据
 
pop_back() //去掉数组的最后一个数据

at()  //得到编号位置的数据

begin() //得到数组头的指针

end() //得到数组的最后一个单元+1的指针
  
find()  //判断元素是否存在

front() //得到数组头的引用

back() //得到数组的最后一个单元的引用

max_size() //得到vector最大可以是多大

capacity() //当前vector分配的大小

size() //当前使用数据的大小 or 返回a在内存中总共可以容纳的元素个数

a.reserve(100); //改变当前vecotr所分配空间的大小将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100

a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,增加的元素其值默认为0

a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,增加的元素其值为2

erase() //删除指针指向的数据项

clear() //清空当前的vector

rbegin() //将vector反转后的开始指针返回(其实就是原来的end-1)

rend() //将vector反转构的结束指针返回(其实就是原来的begin-1)

empty() //判断vector是否为空

swap() //与另一个vector交换数据
a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换

reverse(obj.begin(),obj.end());反向迭代器,实现元素对调

3.find用法

find(数组的头地址, 数组的尾地址, 要找的数)
 
find(nums.begin(), nums.end(), target)

//返回的是target第一次出现的地址
//如果没有找到返回尾地址nums.end()

实例

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using std::vector;
using std::cout;
using std::endl;
int main() {
    vector<int> nums = {2,7,8,8,9};
    int target = 8;
    vector<int>::iterator loc = find(nums.begin(), nums.end(), target);

    if (loc == nums.end()) {
        cout << "数组中没有" << target << endl;
    }
    else {
        cout << "数组中有" << target << endl;
        cout << "并且, 它的第一次出现的位置为:" << loc - nums.begin() << endl;
    }
}

4.访问

#include <bits/stdc++.h>
using namespace std;
int main()
{
    //顺序访问
    vector<int>obj;
    for(int i=0;i<10;i++)
    {
        obj.push_back(i);//存储数据
    }
    
    //方法一数组访问
    cout<<"直接利用数组:";
    for(int i=0;i<10;i++)
    {
        cout<<obj[i]<<" ";
    }
    cout<<endl;
    
  
    //方法二,使用迭代器将容器中数据输出
    cout<<"利用迭代器:" ;
    vector<int>::iterator it;
    //声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素
    for(it=obj.begin();it!=obj.end();it++)
    {
        cout<<*it<<" ";
    }
  
    return 0;
}

5.insert插入

insert()  //往vector任意位置插入一个元素,指定位置或者指定区间进行插入,
 //第一个参数是个迭代器,第二个参数是元素。返回值是指向新元素的迭代器

vector<int> vA;
vector<int>::iterator it;

//指定位置插入
//iterator insert(const_iterator _Where, const _Ty& _Val)
//第一个参数是个迭代器位置,第二个参数是元素
it = vA.insert(vA.begin(),2); //往begin()之前插入一个int元素2 (vA={2,1}) 此时*it=2

  
//指定位置插入
//void insert(const_iterator _Where, size_type _Count, const _Ty& _Val) 
//第一个参数是个迭代器位置,第二个参数是要插入的元素个数,第三个参数是元素值
it = vA.insert(vA.end(),2,3);//往end()之前插入2个int元素3 (vA={2,1,3,3}) 此时*it=3


//指定区间插入
//void insert(const_iterator _Where, _Iter _First, _Iter _Last) 
vector<int> vB(3,6);  //vector<类型>标识符(最大容量,初始所有值)
it = vA.insert(vA.end(),vB.begin(),vB.end()); //把vB中所有元素插入到vA的end()之前 (vA={2,1,3,3,6,6,6})
//此时*it=6,指向最后一个元素值为6的元素位置



//删除元素操作:
 
pop_back()  从vector末尾删除一个元素

erase()  从vector任意位置删除一个元素,指定位置或者指定区间进行删除,第一个参数都是个迭代器。返回值是指向删除后的下一个元素的迭代器

clear()   清除vector中所有元素, size=0, 不会改变原有capacity

6.排序

sort(v.begin(), v.end(),less<int>()); // 升序
sort(v.begin(), v.end(),greater<int>()); // 降序

7.删除元素

  • \(erase()\) 函数:

    \(erase()\) 函数用于在顺序型容器中删除容器的一个元素,有两种函数原型,\(c.erase (p ),c.erase(b,e);\) 第一个删除迭代器 \(p\) 所指向的元素,第二个删除迭代器 \(b,e\) 所标记的范围内的元素,\(c\) 为容器对象,返回值都是一个迭代器,该迭代器指向被删除元素后面的元素(这个是重点)

for(auto iter=vec.begin();iter!=vec.end(); ) {
    if( *iter == 3) iter = veci.erase(iter);//当删除时erase函数自动指向下一个位置,就不需要进行++
    else iter ++ ;    //当没有进行删除的时候,迭代器++
}
  • \(remove()\) 函数:

    \(remove\) 是个stl的通用算法 std::remove(first,last,val) 移除 \([first, last)\) 范围内等于 \(val\) 的元素在\(vector\) 里面用就类似于 iter=std::remove(vec.begin(), vec.end(), val) 但这个函数只是把 \(val\) 移到\(vec\) 的末尾,并不真正删除,真正删除还是要调用一次erase函数

veci.erase(remove(vec.begin(),vec.end(),3),vec.end());
  • 重复元素

标签:vA,begin,end,迭代,元素,用法,vector,数据结构
From: https://www.cnblogs.com/marti88414/p/17595706.html

相关文章

  • Java面试题 P28:数据库篇:MySql篇-MySql优化-索引-什么是索引?索引的底层数据结构是什么?
    什么是索引:索引(index)是帮助MySql高效获取数据的数据结构(有序)。在数据之外,数据库还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 ......
  • 数据结构与算法(三):单向链表
    链表定义链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑是通过链表种的指针链接次序实现的。链表由一系列节点组成,每个节点包括两部分:一个是存储数据元素的数据域,一个是存储下一个节点地址的指针域。单向链表从头节点(也可以没有头节点)开始,指针指向下一个节点的......
  • 线性数据结构和 STL
    vector容器(container)定义及头文件引入定义:一个可变长数组头文件:#include<vector>常用变量定义及函数解析end():尾后迭代器。push_back(x):在末端插入元素x(自动扩容)。构造函数一个参数:建立长度为n的数组:vector<int>a(n);两个参数:建立长度为n,每个元素的值均为......
  • FFmpeg方法用法大全【欢迎补充】
    1.定义FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开......
  • nmap用法
    Ping扫描nmap-easily-ping-scan-all-addresses-in-my-subnetnmap-sP192.168.122.0/24 DHCP扫描Nmap扫描教程之网络基础服务DHCP服务类  sudonmap-sU-p67--script=dhcp-discover192.168.122.0/24 iprsudonmap--scriptbroadcast-dhcp-discover-e......
  • 基础树形数据结构
    基础树形数据结构0.前言某个MXY问我为什么要讲树形数据结构。原因就是因为它复杂码量大可以装逼,还可以出一点毒瘤题,最重要的是我第一个学的难的知识就是这个能对于修改和查询的优化。下面是四个典型数据结构时间复杂度的比较↓数组前缀和线段树傻子社长树状数组......
  • pandas模块---------------------------------常用求平均average的用法
    求平均值代码:importpandasaspd#导入模块df=pd.read_excel(r'C:\Users\Administrator/Desktop/test/1.xlsx')#文件路径a=lambdax:x.mean(1).round(2)#lambda函数m=a(df.iloc[:,1:3])#传入第1-3列计算平均值m=pd.DataFrame(m,columns=['平均分'])#转成dataframe,命名列df['......
  • spring RestTemplate用法详解
    前面介绍过spring的MVC结合不同的view显示不同的数据,如:结合json的view显示json、结合xml的view显示xml文档。那么这些数据除了在WebBrowser中用JavaScript来调用以外,还可以用远程服务器的Java程序、C#程序来调用。也就是说现在的程序不仅在BS中能调用,在CS中同样也能调用,不过你需要......
  • Bitset用法
    众所周知\(Bitset\)可以将一些\(O(n)\)的操作优化为\(O(N/w)\)相当于优化了\(>=\)一只\(log\)!!!\(bitset\)每一位占一个\(bit\),而不是一个\(Byte\)!!!若一次操作复杂度为\(O(N)\)\(bitset\)的操作复杂度为\(O(N/w)\)\(w\)为计算机字长,\(w\)位系统字长为\(w\)相比之下,空间......
  • Map和Object:JS如何根据需求选择正确的键值对数据结构
    Map和Object都是JavaScript中常用的数据结构,它们都可以用来存储键值对(key-valuepairs)。但是,它们之间也有一些重要的区别,了解这些区别可以帮助我们选择更合适的数据结构来满足我们的需求。公众号:Code程序人生,个人网站:https://creatorblog.cnObject的特点Object是JavaScript中最基本......