STL - vector
发布日期:2022-03-03 02:49:13 浏览次数:1 分类:技术文章

本文共 3555 字,大约阅读时间需要 11 分钟。

目录


前言

C++ STL中的verctor好比是C语言中的数组,但是vector又具有数组没有的一些高级功能。与数组相比,vector就是一个可以不用再初始化就必须制定大小的边长数组,当然了,它还有许多高级功能。


1.头文件

#include 

2.初始化

如果vector的元素类型是int,默认初始化为0;如果vector元素类型为string,则默认初始化为空字符串。

vector
v1;vector
v2;vector
v3;vector
>; //注意空格。这里相当于二维数组int a[n][n];vector
v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括号vector
v6 = { "hi","my","name","is","lee" };vector
v7(5, -1); //初始化为-1,-1,-1,-1,-1。第一个参数是数目,第二个参数是要初始化的值vector
v8(3, "hi");vector
v9(10); //默认初始化为0vector
v10(4); //默认初始化为空字符串

3.添加元素

请使用push_back加入元素,并且这个元素是被加在数组尾部的。

for (int i = 0; i < 20; i++){	v1.push_back(i);}

4.访问vector中的元素

for (int i = 0; i < v1.size(); i++){	cout << v1[i] << endl;	v1[i] = 100;	cout << v1[i] << endl;}

注意:只能对已存在的元素进行赋值或者修改操作,如果是要加入新元素,务必使用push_back。push_back的作用有两个:告诉编译器为新元素开辟空间、将新元素存入新空间里。

比如下面的代码是错误的,但是编译器不会报错,就像是数组越界。

vector
vec;vec[0] = 1; //错误!

当然我们也可以选择使用迭代器来访问元素

vector
v6 = { "hi","my","name","is","lee" };for (vector
::iterator iter = v6.begin(); iter != v6.end(); iter++){ cout << *iter << endl; //下面两种方法都都可以检查迭代器是否为空 cout << (*iter).empty() << endl; cout << iter->empty() << endl; }

上面是正向迭代,如果我们想从后往前迭代该如何操作?

使用反向迭代器

for (vector
::reverse_iterator iter = v6.rbegin(); iter != v6.rend(); iter++){ cout << *iter << endl;}

5.插入元素

下面的例子,演示了如何使用 insert() 函数向 vector 容器中插入元素。

#include 
#include
#include
using namespace std;int main(){ std::vector
demo{1,2}; //第一种格式用法 demo.insert(demo.begin() + 1, 3);//{1,3,2} //第二种格式用法 demo.insert(demo.end(), 2, 5);//{1,3,2,5,5} //第三种格式用法 std::array
test{ 7,8,9 }; demo.insert(demo.end(), test.begin(), test.end());//{1,3,2,5,5,7,8,9} //第四种格式用法 demo.insert(demo.end(), { 10,11 });//{1,3,2,5,5,7,8,9,10,11} for (int i = 0; i < demo.size(); i++) { cout << demo[i] << " "; } return 0;}

6.删除元素

前面提到,无论是向现有 vector 容器中访问元素、添加元素还是插入元素,都只能借助 vector 模板类提供的成员函数,但删除 vector 容器的元素例外,完成此操作除了可以借助本身提供的成员函数,还可以借助一些全局函数。

基于不同场景的需要,删除 vecotr 容器的元素,可以使用下表 中所示的函数(或者函数组合)。

pop_back() 成员函数的用法非常简单,它不需要传入任何的参数,也没有返回值。举个例子:

#include 
#include
using namespace std;int main(){ vector
demo{ 1,2,3,4,5 }; demo.pop_back(); //输出 dmeo 容器新的size cout << "size is :" << demo.size() << endl; //输出 demo 容器新的容量 cout << "capacity is :" << demo.capacity() << endl; for (int i = 0; i < demo.size(); i++) { cout << demo[i] << " "; } return 0;}

运行结果为:

size is :4capacity is :51 2 3 4

可以发现,相比原 demo 容器,新的 demo 容器删除了最后一个元素 5,容器的大小减了 1,但容量没变。

如果想删除 vector 容器中指定位置处的元素,可以使用 erase() 成员函数,该函数的语法格式为:

iterator erase (pos);

其中,pos 为指定被删除元素位置的迭代器,同时该函数会返回一个指向删除元素所在位置下一个位置的迭代器。

下面的例子演示了 erase() 函数的具体用法:

#include 
#include
using namespace std;int main(){ vector
demo{ 1,2,3,4,5 }; auto iter = demo.erase(demo.begin() + 1);//删除元素 2 //输出 dmeo 容器新的size cout << "size is :" << demo.size() << endl; //输出 demo 容器新的容量 cout << "capacity is :" << demo.capacity() << endl; for (int i = 0; i < demo.size(); i++) { cout << demo[i] << " "; } //iter迭代器指向元素 3 cout << endl << *iter << endl; return 0;}
运行结果为:
size is :4capacity is :51 3 4 53

通过结果不能看出,erase() 函数在删除元素时,会将删除位置后续的元素陆续前移,并将容器的大小减 1。

转载地址:https://blog.csdn.net/jhfhfhu/article/details/121051659 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:STL - map
下一篇:山山的日记

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月16日 04时20分48秒