赞
踩
概念:迭代器是一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器内元素的访问,但不同的容器有不同的迭代器,初学者可以将迭代器理解为指针。
如果你还不了解容器,那没关系,我已经为你准备好了一些C++STL常用容器详解:
string容器详解
vector容器详解
deque容器详解
list容器详解
set容器详解
stack容器详解
queue容器详解
如果对你有帮助,可以订阅我的C++专栏,以后会经常更新有关C++的知识
顾名思义,begin()就是指向容器第一个元素的迭代器 如果你是初学者,你可能会猜到 end()是指向容器最后一个元素的迭代器, 但事实并非如此,实际上,end()是指向容器最后一个元素的下一个位置的迭代器
如何使用begin(),end()?
两种方式(假设rq是容器名):
以vector容器为例:
void text() { vector<int> vtr; //初始化容器 for (int i = 0; i < 10; ++i) { vtr.push_back(i); } //利用迭代器遍历容器 cout << "方式1:"; for (vector<int>::iterator it = vtr.begin(); it != vtr.end(); ++it) { cout << *it << " "; } cout << "\n方式1:"; for (vector<int>::iterator it = begin(vtr); it != end(vtr); ++it) { cout << *it << " "; } cout << endl; }
上面这段代码用了一些迭代器的功能,下面会详细介绍
按照迭代器的功能强弱,可以把迭代器分为以下几种类型:
上面有5种类型的迭代器,我们先来了解一下他们的一些通用功能
下面将具体介绍这几种类型的迭代器其不同之处
功能:
功能:
功能:
功能:
功能:
总结:
双向迭代器和随机访问迭代器是最为常用的,因此下面演示这两种迭代器的用法
以list容器为例
void text() { list<int> lst; for (int i = 0; i < 10; ++i) { lst.push_back(i); } list<int>::iterator it;//创建list的迭代器 cout << "遍历lst并打印: "; for (it = lst.begin(); it != lst.end(); ++it)//用 != 比较两个迭代器 { cout << *it << " "; } //此时it=lst.end(),这个位置是最后一个元素的下一个位置,没有存储数据 --it;//等价于it--,回到上一个位置 //it -= 1; //报错,虽然都是-1,但这种方式是随机迭代器才有的功能 cout << "\nlst的最后一个元素为:" << *it << endl; }
唯一要注意的就是对于迭代器来说,虽然都是加1或者减1,但- -不等同于- =1,++不等同于+=1,他们实现的是不同的功能
以vector容器为例
void text() { vector<int> v; for (int i = 0; i < 10; ++i) { v.push_back(i); } vector<int>::iterator it; for (it = v.begin(); it != v.end(); ++it) //用 != 比较两个迭代器 { cout << *it << " "; } cout << endl; for (it = v.begin(); it < v.end(); ++it) //用 < 比较两个迭代器 { cout << *it << " "; } cout << endl; it = v.begin();//让迭代器重新指向首个元素的位置 while (it < v.end())//间隔一个输出 { cout << *it << " "; it += 2; // 用 += 移动迭代器 } cout << endl; it = v.begin(); cout << it[5] << endl; //用[]访问 }
对于vector容器来说,其迭代器有失效的可能。
vector容器有动态扩容的功能,每当容器容量不足时,vector就会进行动态扩容,动态扩容不是在原来的空间后面追加空间,而是在寻找一段新的更大的空间,把原来的元素复制过去。
但是这样一来,容器存储元素的位置就改变了,原来的迭代器还是指向原来的位置,因此每次进行动态扩容后原来的迭代器就会失效。
STL 中有用于操作迭代器的三个函数模板,它们是:
要使用上述模板,需要包含头文件
#include<algorithm>
下面的程序演示了这三个函数模板的用法
void text1() { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; list<int> lst(a, a + 10); list<int>::iterator it1 = lst.begin(); advance(it1, 2); //it1向后移动两个元素,指向3 cout << "当前it1指向的元素:" << *it1 << endl; //输出3 advance(it1, -1); //it1向前移动一个元素,指向2 cout << "当前it1指向的元素:" << *it1 << endl; //输出2 list<int>::iterator it2 = lst.end(); it2--; //it2指向最后一个元素的位置,即10的位置 cout << "it1和it2的距离" << distance(it1, it2) << endl; //输出8 cout << "交换前打印:"; for (it1 = begin(lst); it1 != end(lst); ++it1) { cout << *it1 << " "; } it1 = begin(lst); iter_swap(it1, it2); //交换 1 和 10 cout << "\n交换后打印:"; for (it1 = begin(lst); it1 != end(lst); ++it1) { cout << *it1 << " "; } cout << endl; }
谢谢你的观看,如果你喜欢的话,点赞评论加关注啦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。