迭代器的意义何在?
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((方法可能很慢时(。
如果你想阅读更多关于它:
为什么使用迭代器而不是数组索引?
迭代程序。。为什么要使用它们?
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?