为什么要使用迭代器?
例如,如果我有这样的代码:
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算法中很有用,但为什么我应该在普通代码中执行它,因为它更冗长?
答案 0 :(得分:2)
并非所有容器都具有随机访问权限,因此您可以对索引进行查找,因此规范化接口迭代器非常有用。考虑std::list
。它不支持通过[]
运算符进行随机访问。
考虑到这一点,要处理许多异构类型的容器,许多STL函数(如std :: copy)都会使用迭代器。
答案 1 :(得分:1)
假设我们有这段代码:
typedef std::vector<std::string> strings;
strings strs;
for( strings::const_iterator it = strs.begin(); it != strs.end(); ++it ) {
}
后来因为watever原因我们决定切换到std :: list。所以我们只需要替换typedef和code:
typedef std::list<std::string> strings;
strings strs;
for( strings::const_iterator it = strs.begin(); it != strs.end(); ++it ) {
}
将像以前一样工作。但是具有索引变量的代码将失败。想象一下如果你需要编写模板代码会怎样。
答案 2 :(得分:0)
关键是迭代器允许你以通用的方式迭代任何支持迭代器的东西。
至于它更冗长,额外的冗长并不可怕(使用auto
或使用基于C ++ 11范围的for循环可以稍微改善你的例子)但这确实是一个风格问题
答案 3 :(得分:0)
tl; dr是迭代器在一般情况下对于不同类型的对象更好地工作(例如,当size()方法可能很慢时)。
如果您想了解更多信息: