C++基础进阶三(vector使用)

上期大致提了一些标准库模板的概念,但相信任何一个人都不喜欢听无聊的套话理论,现在就容器vector为例子来对上一期理念进行更详细的阐述

vector类定义了STL提供的一种容器。它满足动态数组(大小根据需要多少而开辟多少的理念)的一般性描述。另外,vector还定义了用于操作向量(vector)元素的成员函数。也就是说,向量实现了比数组的全部还要多的功能。
到此为止,你可能就会想:既然已经能使用数组,为什么还要开辟这样类型的向量呢,多此一举?不,我们对比数组可知,向量存在一些决定性的优势,如下:
向量可以根据用户需求而改变大小,而数组却做不到这一点,这体现了向量的灵活性。同时意味着如果在一个游戏中使用向量来存储敌人的对象,它的大小可以增长以适应创建的敌人的数目。如果使用数组,就必须创建一个能存储最大数目敌人的数组,一般数组肯定就做不到这一点。
向量可以和STL里面自带的算法一起配套使用,但数组却不行。这意味着使用向量就获得了如查找排序这样复杂的功能。如果使用数组,除了可以调用sort函数外,其他功能就只能自己写函数代码实现了。
俗话说:金无足赤人无完人,再好的东西也有缺点。向量相对于数组有如下一些缺点:
1.向量需要一些额外的内存开销。
2.向量大小增长的时候可能会带来性能上的损失。
3.在某些游戏控制台系统下有可能不支持对vector的使用
当然,就目前广大用户的体验情况推测,STL在大多数项目中还是很受欢迎的。
一.使用向量的准备工作
在声明向量之前,必须将含有其定义的头文件包含在内(有万能头文件的小伙伴跳过)

#include<vector>

STL中所有组件都属于std名称的空间内,因此通过使用下面代码可以省去相关前缀std::

using namespace std;

二.向量的声明
在你的代码块里声明一个向量

vector<string> vec;

上面一行代码声明一个可以包含string对象元素的名为vec的空向量。声明空向量没有问题,因为当增加新元素时,其大小也会随之改变。
当然还有一些其他构造方法(仅以int类型为例):
在这里插入图片描述

总结:一般向量声明 vector<构造的数据类型> 新向量名称
三.向量成员函数
1.push_back()函数该成员函数在向量的末尾再添加一个新的元素。
2.size()函数该成员函数或者当前向量内部元素的数目。
3.pop_back()函数该成员函数移除向量的最后一个函数,并且将其大小减1。
4.clear()函数该成员函数移除向量内部全部元素,置其大小为0(空向量)
5.empty()函数该成员函数判断向量是否为空,是返回1,否则返回0
举例:

#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;
vector<int> v1;
//vector<int> v2[20]; //开辟21个相同类型的动态数组空间,形成二维数组
//vector<vector<int> > v3; //开辟二维动态数组,和v2有点类似
//vector<int> v4(20,0); //开辟大小为20的动态数组空间,初始化为0
//vector<int> v5(v1); //开辟一个动态数组空间,并将v1拷贝至v5中

int main(void)
{
    v1.push_back(5);
    v1.push_back(2);
    v1.push_back(4);
    v1.push_back(6);
    printf("当前向量元素数目为:%d\n",v1.size());
    cout<<"移除该向量末尾元素之后"<<endl;
    v1.pop_back();
    printf("当前向量元素数目为:%d\n",v1.size());
    cout<<"清空该向量元素之后"<<endl;
    v1.clear();
    printf("当前向量元素数目为:%d\n",v1.size());
    return 0;
}

在这里插入图片描述
四.使用vector类的迭代器
迭代器是将容器的潜力发挥到极致的关键。迭代器可以用于循环访问序列容器。另外,STL某些重要部分需要用到迭代器。许多容器的成员函数和STL算法将迭代器作为其实参,因此,如果希望从成员函数和算法中获益,就必须使用迭代器!
由于迭代器的内部函数也较为复杂,这里只是简单实现一下vector类循环访问元素的过程)
1.迭代器声明:

头文件:
#include<iterator>

2.声明一个迭代器:

vector<int>::iterator it;

3.循环访问vector:
迭代器访问向量vector,就是通过两个重要的接口来实现begin()end().
begin()是vector起初的元素位置,而end()是vector中最后一个元素位置的后一位。

在这里插入图片描述例子:

#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;
vector<int> v1;

int main(void)
{
    v1.push_back(5);
    v1.push_back(2);
    v1.push_back(4);
    v1.push_back(6);
    vector<int>::iterator it;
    for(it = v1.begin();it != v1.end(); ++it)
        cout<<*it<<' ';
    cout<<endl;
    return 0;
}

看到上面的for循环,该语句将引用v1第一个元素(即数值5)的迭代器赋值给it,这样子通过it指针的移动逐渐输出vector里面的所以元素。

在这里插入图片描述

当然vector还有一种遍历输出方式,和一般的数组一样

#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;
vector<int> v1;

int main(void)
{
    v1.push_back(5);
    v1.push_back(2);
    v1.push_back(4);
    v1.push_back(6);
    //vector<int>::iterator it;
    for(int i=0;i!=v1.size();i++)
        cout<< v1[i] <<' ';
    cout<<endl;
    return 0;
}

在这里插入图片描述 后续会继续说明迭代器的一些知识。谢谢支持!

继续学习它点这里

参考书籍:
C++游戏编程入门(Michael Dawson著)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

凌晨小街

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

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

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

打赏作者

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

抵扣说明:

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

余额充值