C++基础进阶四(vector类迭代器)

对得起未来的是坚持和努力

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

老话重提:
迭代器是将容器的潜力发挥到极致的关键。迭代器可以用于循环访问序列容器。另外,STL某些重要部分需要用到迭代器。许多容器的成员函数和STL算法将迭代器作为其实参,因此,如果希望从成员函数和算法中获益,就必须使用迭代器!
在这里插入图片描述
在这里插入图片描述

一.声明一个迭代器:

vector<int>::iterator it;

这行代码为包含int对象的向量声明了一个名为 it 的迭代器。如果要声明自己的迭代器,有以下的模板操作:先写成你指定容器的类型,接着是容器包含的对象的类型(重申:用< >括起来),然后是作用域解析运算符(符号 :: ),最后是iterator和新的迭代器的名称
那么什么是迭代器呢?迭代器是标识容器中某个特定元素的值。给你一个迭代器,你可以访问其中元素的值;给定正确类型的迭代器(不是固定的迭代器,const_iterator就不能进行修改),你可以修改其值。迭代器还可以通过常见的算术运算符在元素之间移动。
可以将迭代器想像成贴在容器中某个特定元素上的标签。迭代器虽然不是元素本身,但它是引用元素的一种方式。具体而言,我们可以使用上述声明的it引用我们声明的向量vec中的特定元素。即可将it标签贴在向量vec中的特定元素上。一旦贴上后,就能够通过该迭代器访问甚至修改相应元素(修改的前提是定义了正确类型的迭代器)
接下来继续声明另一个迭代器

vector<int>::const_iterator MyIt;

改行代码和上面声明唯一不一样的地方是迭代器的类型不同,它为一个包含int对象的向量创建了一个名为MyIt常量迭代器,除了不能用来修改其引用的元素外,常量迭代器常规迭代器的其他功能基本一致。由常量迭代器引用的元素必须保持不变。可以将常量迭代器想象成提供了只读访问权限,没有修改权限。即如果需要,你可以让MyIt在vec之中,然而无法通过MyIt修改任何元素的值。
总结:使用常量迭代器,标签的位置可以改变,但是被标签的元素不能被修改。
那么问题来了,如果常量迭代器是带限制的常规迭代器,那为什么还要用它呢?
首先,这使程序的意图比较清晰。在使用常量迭代器时,很显然不需要修改它引用的元素。其次,这样子更加安全,防止程序内部发生不可预估的意外修改操作。
(滑稽)是否觉得迭代器的内容过于抽象?亦或是厌恶它(还是一般数组香)。no problem,接下来真正使用它

1. 迭代器的元素访问在上去介绍vector就说了,就不过多重复了。
(我还是要提一下迭代器的解引用
给定一个for循环

vector<int> vec;
vector<int>::iterator it;
for(it = vec.begin();it != vec.end(); ++it)
	cout<< *it<<endl;

迭代器解引用: 程序在循环体中将“ *it ”发送给 cout,将解引用运算符 * 置于it之前,这样就可以显示该迭代器引用的元素(不是迭代器自身)的值。这样做相当于在告诉程序:“嘿,程序,你要将它当作迭代器引用的内容来对待,而不是迭代器自身
2.访问向量元素的成员函数
看一行代码:

cout<<(*it).size()<<endl;

中间输出的代码的意思是“调用 it 解引用后所得对象的成员函数size()”。但所谓cxy的懒不是我们能理解的,所以代码又被简化成

cout<< it->size() <<endl;

3.使用向量的成员函数——insert()
有一种形式的insert()成员函数将新元素插入至向量中给定迭代器引用的元素之前。此形式的insert()函数需要两个实参:第一个为一个迭代器,第二个为带插入元素的值。因此插入位置之后所有的元素位置都将后移一位。而此种insert()函数返回一个迭代器,它引用新插入的元素。例子:

#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;
    cout<<"插入前:"<<endl;
    cout<<"元素数量:"<<v1.size()<<endl;
    for(it = v1.begin();it != v1.end(); ++it)
        cout<<*it<<' ';
    cout<<endl;
    v1.insert(v1.begin()+1,99);
    cout<<"插入后:"<<endl;
    cout<<"元素数量:"<<v1.size()<<endl;
    for(it = v1.begin();it != v1.end(); ++it)
        cout<<*it<<' ';
    cout<<endl;
    return 0;
}

在这里插入图片描述
4.使用向量的成员函数——erase()
有一种形式的erase()函数可以从向量中移除一个元素,该形式函数erase只需要传入一个实参:需要移除元素的迭代器,该函数返回也是一个迭代器,具体见下面的例子:

#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;
    cout<<"插入前:"<<endl;
    cout<<"元素数量:"<<v1.size()<<endl;
    for(it = v1.begin();it != v1.end(); ++it)
        cout<<*it<<' ';
    cout<<endl;
    v1.insert(v1.begin()+1,99);
    cout<<"插入后:"<<endl;
    cout<<"元素数量:"<<v1.size()<<endl;
    for(it = v1.begin();it != v1.end(); ++it)
        cout<<*it<<' ';
    cout<<endl;
    v1.erase(v1.begin()+2);
     cout<<"移除begin()+2位置元素的迭代器后:"<<endl;
    cout<<"元素数量:"<<v1.size()<<endl;
    for(it = v1.begin();it != v1.end(); ++it)
        cout<<*it<<' ';
    cout<<endl;
    return 0;
}

在这里插入图片描述
附页:这里再介绍一种输出流迭代器
对某种容器类型A的容器a,按顺序输出所有元素,并指定元素间的分隔符’~’,写:
copy(a.begin(), a.end(), ostream_iterator(cout, “~”));
注意 ostream_iterator(cout, “~”) 是一个临时迭代器对象。

#include<iostream>
#include<vector>
#include<iterator>
#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);

    ostream_iterator<int> output(cout," ");
    copy(v1.begin(),v1.end(),output);
    return 0;
}

运行结果:

在这里插入图片描述

结束了,呼,打字不易啊!,下期会说明一些简单的算法和算法性能,感谢支持.

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

凌晨小街

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

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

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

打赏作者

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

抵扣说明:

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

余额充值