2025年[C++STL] vector 可变长数组 用法详解

[C++STL] vector 可变长数组 用法详解前言 vector 是一个常用的 C 标准库类 它可以和数组一样 在常数时间内实现随机访问 不仅如此 vector 类中封装的一些方法 如尾部快速插入 判空 使得它更加实用 强大 索引 vector 一 初始化 二 尾部

大家好,我是讯享网,很高兴认识大家。

前言

vector是一个常用的C++标准库类。
它可以和数组一样,在常数时间内实现随机访问。
不仅如此,vector类中封装的一些方法(如尾部快速插入,判空),使得它更加实用、强大。

索引

vector
    一、初始化
    二、(尾部)插入 弹出
    三、随机访问
    四、容器大小
        1. 大小设置
        2. 大小查询
    五、容器遍历
        1.使用迭代器遍历容器
        2.使用下标遍历容器
    六、其他(不常用)
        1. 赋值
        2. (指定位置)插入 删除
        3. 容器清空


vector

vector定义在vector头文件中。
实用之前需要手动包含头文件.

#include<vector> 

讯享网

一、初始化

语法
  • vector vec :初始化一个存放type类型数据的vector空对象vec
  • vector vec1(vec2):使用vector对象vec2初始化对象vec1
  • vector vec(beg,end):使用[beg,end)地址区间内的元素初始化对象vecbegend可以是指针,或者迭代器。
  • vector vec(size):初始化一个元素个数为size的对象vec
  • vector vec(size,t):初始化一个元素个数为·size·,元素值为t的对象vec
代码示例
讯享网#include<vector> vector<int> v1; vector<int> v2(v1); vector<int> v3(v1.begin(),v1.end()); vector<int> v4(5); vector<int> v5(5,1); 

二、(尾部)插入 弹出

语法
  • vector.push_back(t):在容器的尾部插入元素t
  • vector.pop_back():弹出(即删除)容器尾部元素。
代码示例
#include<vector> using namespace std; int main(){ 
    vector<int> v1; v1.push_back(12); // 在尾部插入12 v1.pop_back(); // 弹出尾部元素 return 0; } 

三、随机访问

语法
  • v[idx]:使用[]运算符进行随机访问(类似于对数组元素进行访问)
  • v.at(idx):使用at方法进行随机访问,放回指定元素的引用。
    这两个方法都可以对vector对象进行随机访问。
  • v.front():返回对象v的首个元素的常引用。
  • v.back():返回对象v的最后一个元素的常引用。

ps:[]运算符和at方法都可以实现随机访问,不同的是at方法在访问时会进行访问检查,当访问超出容器范围时,会抛出out_of_range异常。

代码示例
讯享网#include<vector> #include<iostream> using namespace std; int main(){ 
    vector<int> a; a.push_back(10); a.push_back(11); a.push_back(12); a.push_back(13); cout << a[0] << endl; a[0] ++; cout << a[0] << endl; cout << "========" << endl; cout << a.at(1) << endl; a.at(1) = 0; cout << a.at(1) << endl; cout << "========" << endl; cout << a.front() << endl; cout << "========" << endl; cout << a.back() << endl; return 0; } 

输出

10 11 ======== 11 0 ======== 11 ======== 13 

四、容器大小

1. 大小设置

  • v.resize(h,[val]):设置vector的长度为h
    - 如果h小于原本vector容器长度,那么从第h个元素开始往后的元素都将被销毁。
    - 如果h大于原本的vector容器长度,那么会从原本vector容器后面补全h个元素(如果指定了值val,那么会用val初始化新增加的值)。
    - 如果h同时大于capacity,那么会自动完成内存分配。
  • v.reserve(h) 改变当前vecotr所分配空间的大小。
    • 如果h的值大于当前capacity的大小,则会将容器内存分配至h
    • 如果h的值不大于当前capacity的大小,则不做出操作。

2. 大小查询

  • v.size():返回对象v当前元素个数
  • v.max_size():返回容器最大可能的分配到的空间大小
  • v.capacity():返回容器当前已分配到的空间大小(如果元素过多,将会自动为容器分配更多的空间
  • v.empty():返回一个布尔值,表示容器是否为空。

欢迎阅读我的另一篇文章,增加对这几个函数的理解和区分→ vector size max_size capacity区别与理解

代码示例
讯享网#include<vector> #include<iostream> using namespace std; int main(){ 
    vector<int> v; v.resize(11); v.reserve(1123); cout << "size:" << v.size() << endl; cout << "capacity:" << v.capacity() << endl; cout << "max_size:" << v.max_size() << endl; return 0; } 

输出

size:11 capacity:1123 max_size: 

五、容器遍历

vector容器遍历一般有两种办法

1.使用迭代器遍历容器
讯享网#include<vector> #include<iostream> using namespace std; int main(){ 
    vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); for(vector<int>::iterator p = v.begin();p != v.end();p++) // 顺序遍历  cout << *p << " "; cout << endl; for(vector<int>::reverse_iterator p = v.rbegin();p != v.rend();p++) // 倒序遍历  cout << *p << " "; cout << endl; return 0; } 

输出


讯享网

1 2 3 4 4 3 2 1 

ps:可以将vector<int>::iterator简写为auto,即让编译器自动识别变量类型。

特别注意:

逆序迭代器vector<int>::reverse_iteratorC++11新特性,在C++98中不存在。

2.使用下标遍历容器
讯享网#include<vector> #include<iostream> using namespace std; int main(){ 
    vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); for(int i = 0;i < (signed)v.size();i++) // 顺序遍历  cout << v[i] << " "; cout << endl; for(int i = v.size() - 1;i >= 0;i--) cout << v[i] << " "; cout << endl; return 0; } 

输出

1 2 3 4 4 3 2 1 

使用下标进行遍历,这种方式和对数组进行遍历一样,所以更容易让人接受。
但使用下标遍历,可能会有潜在的效率问题。欢迎阅读我的另外一篇文章,进行深入了解→size复杂度问题

六、其他(不常用)

1. 赋值

语法
  • v.aasign(beg,end):将[beg,end)地址区间的值赋给vector对象v
  • v.assign(n,val):将n个值val赋值给对象v
    调用该方法后,对象v原本的数据都会被销毁。
    当且仅当赋值后所需的内存大于容器原有内存时,系统会自动为容器重新分配内存。
代码示例
讯享网#include<iostream> #include<vector> using namespace std; int main(){ 
    vector<int> a,b; a.push_back(5); a.push_back(3); cout << "赋值前:"; for(auto p = a.begin();p != a.end();p++) cout << *p << " "; cout << endl; a.assign(5,1); cout << "赋值后:"; for(auto p = a.begin();p != a.end();p++) cout << *p << " "; cout << endl; b.push_back(10); b.push_back(12); b.push_back(48); cout << "使用b赋值后:"; a.assign(b.begin(),b.end()); for(auto p = a.begin();p != a.end();p++) cout << *p << " "; cout << endl; return 0; } 

输出

赋值前:5 3 赋值后:1 1 1 1 1 使用b赋值后:10 12 48 

2. (指定位置)插入 删除

  • v.insert(ite,val):将值val插入到对象v的迭代器ite所对应的位置。
  • v.insert(ite,n,val):将n个值val插入到迭代器ite所对应的位置。
  • v.insert(ite,beg,end):将区间[beg,end)中的值插入到迭代器ite的位置。
  • v.erase(ite):删除对象v中迭代器ite所对应位置的值。
  • v.erase(beg,end):删除对象v中区间[beg,end)位置的值。

由于inserterase的操作与迭代器关系较为紧密,且通常与find等其他函数结合才能发挥出其实际作用,因此在此不做深入探究。

如果您想要对vector的inserterase方法深入了解,欢迎关注我后续的文章→

3. 容器清空

  • v.clear():清空对象。
    ps:调用clear方法后,对象的size()变为0——即清空了元素,元素个数为0。
    capacity()不变——即不会重新进行内存分配。

参考资料

vector官方文档


原创不易,感谢您的支持。

小讯
上一篇 2025-02-07 17:33
下一篇 2025-03-07 07:59

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67119.html