1.迭代器
C++中有着很多的容器,然而有些容器并不像vector那样支持下标访问,所以就有了迭代器的概念。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(31);
v.push_back(41);
v.push_back(51);
v.push_back(61);
v.push_back(71);
vector<int>::iterator it = v.begin();
while (it != v.end()) {
cout << *it << " ";
it++;
}
cout << endl;
return 0;
}
2.反向迭代器
一个硬币都有着两面,何况是迭代器呢。所以在C++中,存在着反向迭代器的概念。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(31);
v.push_back(41);
v.push_back(51);
v.push_back(61);
v.push_back(71);
vector<int>::reverse_iterator it = v.rbegin();
while (it != v.rend()) {
cout << *it << " ";
it++;
}
cout << endl;
return 0;
}
想要用反向迭代器,首先要记住它的名字,reverse_iterator.
格式为:容器名 + <模板> + 域解析运算符(::) + reverse_iterator
它的设计参考正向迭代器,只是简单的把正向迭代器的功能反过来用。
#pragma once
namespace my_reverse_iterator
{
template<class Iterator, class Ref, class Ptr>
class Reverse_iterator
{
typedef Reverse_iterator<Iterator, Ref, Ptr> Self;
public:
ReverseIterator(Iterator it)
:_it(it)
{}
Ref operator*()
{
Iterator tmp = _it;
return *(--tmp);
}
Ptr operator->()
{
return &(operator*());
}
Self& operator++()
{
--_it;
return *this;
}
Self& operator--()
{
++_it;
return *this;
}
bool operator!= (const Self& s) const
{
return _it != s._it;
}
private:
Iterator _it;
};
// vector和list反向迭代器实现
}
在上面的代码中可以看出,反向迭代器其实就是根据正向迭代器的相对位置来改写的。
比如:
- rbegin()对end()
- rend()对begin()
- ++对–
- –对++
其中要注意的是*的操作运算符的重载,这里同样是根据相对位置来写,因为list容器是带头双向链表,vector容器的end()迭代器是最后一个数的下一个位置。
typedef Reverse_iterator<Iterator, Ref, Ptr> Self
//typedef 是重命名
//<>里面呢就是模板的参数
//这里实际是有3个模板的,但是很多都是代码的复用,所以直接一个模板里面提供了3个模板参数
//就相当于有了3个不同参数的模板