3

为什么要使用迭代器?

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

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()and更常见,而在第二个示例中更常见?增加它的方式有什么区别,为什么不总是使用等号?i++it != begin()++it

我知道迭代器在 C++11 基于范围的 for 循环和一些 STD 算法中很有用,但是为什么我应该在普通代码中这样做,因为它更冗长?

4

4 回答 4

2

并不是所有的容器都具有随机访问权限,因此您可以在索引上进行查找,因此标准化接口迭代器非常有用。考虑std::list。它不支持通过[]运营商进行随机访问。

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

于 2013-02-26T02:50:54.043 回答
1

关键是迭代器允许您以通用方式迭代任何支持迭代器的东西。

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

于 2013-02-26T02:51:34.710 回答
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 ) {
}

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

于 2013-02-26T02:53:59.773 回答
0

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

如果您想了解更多信息:

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

迭代器..为什么要使用它们?

于 2013-02-26T02:55:55.470 回答