迭代器的意义何在?

What's the point of iterators?

本文关键字:迭代器      更新时间:2023-10-16

为什么要使用迭代器?

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

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范围的循环和一些STD算法中可能很有用,但既然它更详细,为什么我要在普通代码中这样做呢?

不是所有的容器都有随机访问,所以你可以在索引上进行查找,所以规范化接口迭代器非常有用。考虑std::list。它不支持通过[]运算符进行随机访问。

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

重点是迭代器允许您以通用方式对任何支持迭代器的东西进行迭代

至于更冗长,额外的冗长并不可怕(使用auto或使用基于C++11范围的for循环可以稍微改进您的示例(,但这实际上是一个风格问题。

假设我们有这样的代码:

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 ) {
}

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

tl;dr是迭代器在一般情况下对不同类型的对象工作得更好(例如,当size((方法可能很慢时(。

如果你想阅读更多关于它:

为什么使用迭代器而不是数组索引?

迭代程序。。为什么要使用它们?