C++ STL 之可变长数组 Vector 详解

Part.I Attention

在这里插入图片描述

使用vector需要注意的地方:

  • 加引用#include <vector>
  • 可直接作为『数组』调用,但是!如果要在函数中修改值,一定要加&!!!

一些技巧:

// 将 b 中的元素去重并从小到大排序
sort(b.begin(),b.end());
b.erase(unique(b.begin(),b.end()),b.end());

Part.II Function

在这里插入图片描述

函数一栏表:

函数名含义
begin()返回指向容器中第一个元素的迭代器。
end()返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
rbegin()返回指向最后一个元素的迭代器。
rend()返回指向第一个元素所在位置前一个位置的迭代器。
size()返回实际元素个数。
max_size()返回元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。
resize()改变实际元素的个数。
capacity()返回当前容量。
empty()判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
reserve()增加容器的容量。
shrink _to_fit()将内存减少到等于当前元素实际所使用的大小。
operator[]重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素。
at()使用经过边界检查的索引访问元素。
front()返回第一个元素的引用。
back()返回最后一个元素的引用。
data()返回指向容器中第一个元素的指针。
assign()用新元素替换原有内容。
push_back()在序列的尾部添加一个元素。
pop_back()移出序列尾部的元素。
insert()在指定的位置插入一个或多个元素。
erase()移出一个元素或一段元素。
clear()移出所有的元素,容器大小变为 0。
swap()交换两个容器的所有元素。
emplace()在指定的位置直接生成一个元素。
emplace_back()在序列尾部生成一个元素。

Chap.I 构造函数

  • 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中

下面是调用构造函数的示例:

// 定义了10个整型元素的向量,初始化为 1
vector<int> a(10,1); 	
// 定义一个二维 vector 向量,所有元素初始化为 1
vector<int> a(10,1);
vector<vector<int>> aa(10,a);
// 通过 int[] 构造并初始化 vector
int b[7] = {1,2,3,4,5,9,8}; 
vector<int> a(b,b+7);
// 直接用数组构造
vector<int> a({1,2,3,4,5,9,8});

Chap.II 增加函数

  • void push_back(const T& x)​:向量尾部增加一个元素X
  • ​iterator insert(iterator it,const T& x)​:向量中迭代器指向元素前增加一个元素x
  • ​iterator insert(iterator it,int n,const T& x)​:向量中迭代器指向元素前增加n个相同的元素x
  • ​iterator insert(iterator it,const_iterator first,const_iterator last)​:向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

下面是一个简单操作实例:

vector<int> a(10,1);	// 10个1
auto itr=a.begin()+3;	// 得到第 3 个迭代器
a.insert(itr,2,8);		// 在迭代器的位置处插入 2 个 8,a=[1  1  1  8  8  1  1  1  1  1  1  1]

Chap.III 删除函数

  • iterator erase(iterator it)​:删除向量中迭代器指向元素
  • ​iterator erase(iterator first,iterator last)​:删除向量中[first,last)中的元素
  • void pop_back()​:删除向量中最后一个元素
  • ​void clear()​:清空向量中所有元素

下面是一个简单操作实例:

auto tmp=a.erase(a.begin()+2,a.begin()+4);
a.pop_back();		// 删除最后一个元素

第一句的含义:删除了vector第 3 个元素到第 5 个元素(不含)共两个元素,返回删除之后的第 3 个元素的迭代器。


Chap.IV 遍历函数

  • T at(int pos)​:返回pos位置元素的引用
  • ​T front()​:返回首元素的引用
  • ​T back()​:返回尾元素的引用
  • ​iterator begin()​:返回向量头指针,指向第一个元素
  • ​iterator end()​:返回向量尾指针,指向向量最后一个元素的下一个位置
  • reverse_iterator rbegin()​:反向迭代器,指向最后一个元素
  • ​reverse_iterator rend()​:反向迭代器,指向第一个元素之前的位置

注意:

  • vector 可以用[]来获取一个某个索引的元素值,但是不能像 python 那样有切片操作。
  • end()返回的是最后一个元素之后的迭代器,*(vec.end()-1)才是最后一个元素的值
vector<int> b({1,2,3,4,5,6,7,8});
cout<<b.front()<<"  "<<b.back()<<endl;		// 1  8
cout<<*b.begin()<<"  "<<*(b.end()-1)<<endl;	// 1  8

Chap.V 判断/大小/其他函数

  • bool empty() const​:判断向量是否为空,若为空,则向量中无元素
  • int size() const​:返回向量中元素的个数
  • ​int capacity() const​:返回当前向量所能容纳的最大元素值
  • ​int max_size() const​:返回最大可允许的 vector 元素数量值
  • void swap(vector&)​:交换两个同类型向量的数据
  • ​void assign(int n,const T& x)​:设置向量中前n个元素的值为x
  • ​void assign(const_iterator first,const_iterator last)​:向量中[first,last)中元素设置成当前向量元素

	cout<<b.empty()<<endl;
    cout<<b.size()<<"  "<<b.capacity()<<"  "<<b.max_size()<<endl;
    printVec(b);
    b.assign(6,10);     // 指定 b 中的元素为6个10
    printVec(b);
    b.assign(b.begin()+1,b.end()-1); // 去掉 b 第一个元素和最后一个元素
    printVec(b);

Part.III Code

下面是学习 Vector 过程中用到的代码(其实就是上面的代码的汇总):

#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

int main()
{
    auto printVec=[](vector<int> vec) {for(auto& c:vec) cout << c << "  ";cout << endl;};
    // 构造
    vector<int> a(10,1);
    printVec(a);
    // 插入
    auto itr=a.begin()+3;
    auto tmp = a.insert(itr,2,8);
    cout << *(tmp+1)<<endl;
    printVec(a);
    // 删除
    tmp=a.erase(a.begin()+2,a.begin()+4);// 删除的元素不包含 itr+1
    cout <<* tmp<<endl;
    printVec(a);
    a.pop_back();
    printVec(a);
    // 修改
    a[3]=3;
    a.push_back(4);
    printVec(a);
    // 遍历
    vector<int> b({1,2,3,4,5,6,7,8});
    cout<<b.front()<<"  "<<b.back()<<endl;
    cout<<*b.begin()<<"  "<<*(b.end()-1)<<endl;
    // 其他函数
    cout<<b.empty()<<endl;
    cout<<b.size()<<"  "<<b.capacity()<<"  "<<b.max_size()<<endl;
    printVec(b);
    b.assign(6,10);     // 指定 b 中的元素为6个10
    printVec(b);
    b.assign(b.begin()+1,b.end()-1); // 去掉 b 第一个元素和最后一个元素
    printVec(b);
    getchar();
    return 0;
}

输出如下:

1  1  1  1  1  1  1  1  1  1
8
1  1  1  8  8  1  1  1  1  1  1  1
8
1  1  8  1  1  1  1  1  1  1
1  1  8  1  1  1  1  1  1
1  1  8  3  1  1  1  1  1  4
1  8
1  8
0
8  8  2305843009213693951
1  2  3  4  5  6  7  8
10  10  10  10  10  10
10  10  10  10
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值