【vector】C++ 数据结构 vector 容器

本文详细介绍了C++标准库中的vector容器。包括vector的构造方法、增删改查操作、迭代器使用及排序方法等。通过丰富的示例代码帮助读者更好地理解和掌握vector的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从今天开始写博客。虽然早就想做这件事了,但是我是谁啊,拖延症重度患者哈哈哈。先从平时刷LeetCode的笔记开始吧。感觉LeetCode的自带笔记有点难用,只能对应一道题,不太方便总结方法。之前为了方便查阅,我都写在了几个本地文件里,但是周末在家或者换台机器就查不到了,总是拷来拷去也不方便维护。今天是2021年2月1日,优快云我来啦!


vector是什么?

向量(Vector)是一个封装了动态大小数组的顺序容器。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单地认为,向量是一个能够存放任意类型的动态数组

#include <vector> 
using namespace std;

1. 构造函数

常用的构造方法有以下几种:

vector() //创建一个空vector
vector(int nSize) //创建一个vector,元素个数为nSize
vector(int nSize,const t& t) //创建一个vector,元素个数为nSize,且值均为t
vector(const vector&) //复制构造函数
vector(begin,end) //复制另一个数组的[begin,end)区间内元素到vector中

举个栗子:

vector<int> v1;  ->{}
vector<int> v2(3);  ->{,,}
vector<int> v3(5,0);  ->{0,0,0,0,0}
vector<int> v4(v3);  ->{0,0,0,0,0}
//vector<int> v4 = v3;  ->同上
vector<int> v5 = {1,2,3,4,5};  ->{1,2,3,4,5}
//vector<int> v5{1,2,3,4,5}  ->同上
vector<int> v6(v5.begin()+1,v5.end()-2);  ->{2,3}
//也可以从静态数组拷贝,注意区间是左闭右开
int arr[5]={1,2,3,4,5};
vector<int> v2(arr,arr+3);  ->{1,2,3}

注意:使用列表元素直接初始化时,列表中元素必须与 vector 的元素类型相容,否则其他类型会进行类型转换。

二维数组的初始化:

vector<vector<int>> v1(n, vector<int>(m)); //n行m列
vector<vector<int>> v2(n, vector<int>(m,0)); //全部元素初始化为0

2. 增删改查

(1)查找

.at(int index) //得到编号位置的数据 
.begin() //得到容器的头指针 
.end() //得到容器的最后一个单元+1的指针 
.front() //得到容器开头元素的引用 
.back() //得到容器的末尾元素的引用 

(2)增加

void push_back(const T& x) //向量尾部增加一个元素x
void insert(v.begin(),const T& x); //向量头部插入元素x

(3)删除

void pop_back() //删除向量中最后一个元素
void clear() //清空向量中所有元素

(4)查询

bool empty() //判空,若为空则返回true
int size() //返回容器中元素的个数
int *max_element(begin,end); //返回最大值

(5)修改

void assign(int n,const T& x) //设置向量中前n个元素的值为x
void assign(const_iterator first,const_iterator last) //向量中[first,last)中元素设置成当前向量元素

举个栗子:

vector<int> v1={2,3,4};
v1.push_back(5);  ->{2,3,4,5}
v1.insert(v1.begin(),1);  ->{1,2,3,4,5}
int size = v1.size();  -> 5
int maxValue = *max_element(v1.begin(), v1.end());  -> 5
int x = v1.back();  -> 5
int y = v1.front();  -> 1
int z = v1.at(2);  -> 3
//感觉front这个好像没什么用,直接v1[0]不是更省事么……at同理
v1.pop_back();  ->{1,2,3,4}
vector<int> v2;
v2.assign(v1.begin(),v1.end());  ->{1,2,3,4}
v2.assign(2,5);  ->{5,5}
//这个assign好像跟初始化的方法差不多
v1.clear();  ->{}
bool isEmpty = v1.empty();  -> true

3.迭代器

这个还不太熟,也不怎么会用QAQ

vector<int>::iterator it;//声明一个迭代器,可以用来指向vector容器的元素 
for(it=vector.begin();it!=vector.end();it++)
{
    cout<<*it<<",";
}

4.排序

注意:需要 #include <algorithm>

sort(vector.begin(),vector.end());//从小到大
reverse(vector.begin(),vector.end());//翻转(从大到小)

举个栗子:

vector<int> v1={2,4,3,1,5};
reverse(v1.begin(),v1.end());  ->{5,1,3,4,2}
sort(v1.begin(),v1.end());  ->{1,2,3,4,5}
reverse(v1.begin(),v1.end());  ->{5,4,3,2,1}

还有更复杂一点的,使用sort的第三个参数来自定义排序方法,用于向量元素类型不能直接比较时,以及不止一个排序条件时。

//例:将freq数组,先按数值从小到大,再按字符串字典序排列
vector<pair<string,int>> freq;
sort(freq.begin(), freq.end(), [=](pair<string,int>& a, pair<string,int>& b) {
    return a.second<b.second || (a.second==b.second && a.first<b.first);
});

总结

vector真的太常用啦,常用方法一定要熟练,我刚开始做题的时候,几乎每天都要开着教程在旁边,随时查方法哈哈哈,现在大部分用法已经比较熟练了(虽然排序方法还是每次都要查嘿嘿)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值