把知识记在小本本上

将零散的知识点放在一个集中的地方,不断递归重构,形成一套为己所用的知识系统。

博客首页 | 小本本首页

对于一个容器的遍历,可以用 for 循环,如下:

1
2
3
4
5
6
7
8
9
10
vector<string> v;
v.push_back("hello");
v.push_back(" world");
v.emplace_back(", Cpp");

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

也可以用迭代器。

迭代器:是一种对容器的遍历工具。

迭代器用起来是指针使用,在内部,不同的容器有不同的实现方式,不一定是原生指针。

迭代器:正向迭代器、反向迭代器、const迭代器。

迭代器的函数:

1
2
3
4
begin()
end()
rbegin()
rend()

C++11 正向、反向有了一些新功能。

pic-2

正向迭代器

1
2
3
4
5
6
7
vector<string>::iterator vit = v.begin();
while (vit != v.end())
{
cout << *vit;
vit++;
}
cout << endl;

反向迭代器

1
2
3
4
5
6
7
vector<string>::reverse_iterator rit = v.rbegin();
while (rit != v.rend())
{
cout << *rit;
++rit;
}
cout << endl;

const 迭代器

1
2
3
4
5
6
7
vector<string>::const_iterator cvit = v.begin();
while (cvit != v.end())
{
cout << *cvit;
cvit++;
}
cout << endl;

C++11 语法糖 auto

在写代码的时候编译器智能提示,让把迭代器改成 auto:

1
2
3
4
5
6
7
auto avit = v.begin();
while (avit != v.end())
{
cout << *avit;
avit++;
}
cout << endl;

语法糖 auto 用于 for 循环

1
2
3
4
5
string str = "abcd";
for (auto e : str)
{
cout << e << endl; // 输出 : abcd
}

感觉尝不到甜头,来一个🌰,感受下:

1
2
3
4
5
6
7
8
9
10
11
std::map<std::string, std::vector<std::string>> strVMap;
std::map<std::string, std::vector<std::string>>::const_reverse_iterator msvit = strVMap.crbegin();
while (msvit != strVMap.crend)
{
++msvit;
}

for (auto e : strVMap)
{
...
}

我靠

好吧,其实用了 auto 编译器编译后也会成迭代器的形式,这个 Java 里的增强 for 也是。

为什么要出现迭代器

在 STL 中有很多容器,容器实现的方式是一些不同的数据结构,如果我们要遍历这些容器中的内容,就需要注意一些细节问题(比如单链表的遍历,从后往前遍历,等等的细节问题)。

迭代器用一种统一的方式来访问容器,不用关心具体的访问细节(屏蔽掉了底层复杂的结构细节)。