迭代器的作用是什么?

4

为什么我应该使用迭代器?

例如,如果我有这样的代码:

for (int i = 0; i < vec.size(); i++)
   cout << vec[i];

编写的优点是什么?

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

此外,为什么在第一个例子中更常用写法是i < vec.size()i++,而在第二个例子中更常用的是it != begin()++it?如何递增迭代器有什么区别,为什么不总是使用等号?
我知道迭代器可以在C++11的基于范围的for循环和一些STD算法中非常有用,但在正常的代码中为什么要这样做,因为它更冗长?

1
这应该就解决了:https://dev59.com/NHVC5IYBdhLWcg3w-WSshttps://dev59.com/6nVC5IYBdhLWcg3wz0h9 - chm
如果vec是一个列表呢? - billz
没有什么比std::for_each(begin(vec), end(vec), [](int x) { std::cout << x; });更好的了。使用算法和迭代器范围而不是手写循环,可以避免一些容易出错的逻辑错误,如偏移量错误等。 - James McNellis
@James McNellis 为什么它更好? - Konstantin Kowalski
我从未见过有人这样写:vector<int>::iterator it != vec.begin();我相当确定那是一个编译时错误。 - Nicol Bolas
我知道在C++11的范围for循环和一些STD算法中,迭代器可以非常有用,但是为什么在普通代码中也要使用它呢?难道范围for循环或算法不被认为是正常的代码吗? - Grizzly
4个回答

2

并非所有容器都具有随机访问,因此无法通过索引进行查找,因此为了规范接口,迭代器是相当有用的。考虑 std::list。它不支持通过[]运算符进行随机访问。

考虑到这一点,为了在许多异构类型的容器之间工作,许多STL函数(如 std::copy)采用迭代器。


1
迭代器的重点在于它允许您以通用的方式对支持迭代器的任何内容进行迭代。
至于说更冗长,额外的冗长并不可怕(而且您的示例可以使用auto或使用C++11范围-based for循环稍微改进),但这确实是一个风格问题。

1
假设我们有以下代码:
typedef std::vector<std::string> strings;

strings strs;
for( strings::const_iterator it = strs.begin(); it != strs.end(); ++it ) {
}

后来出于某种原因,我们决定切换到std::list。所以我们只需要替换typedef和代码:

typedef std::list<std::string> strings;

strings strs;
for( strings::const_iterator it = strs.begin(); it != strs.end(); ++it ) {
}

将像以前一样工作。但是带有索引变量的代码将失败。想象一下,如果您需要编写模板代码会怎样。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接