作为 C++ 新手,我刚刚发现迭代器。我意识到可以使用 int
之一或iterators
for 循环遍历任何容器。例如考虑一下
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
v.push_back(1);
v.push_back(4);
v.push_back(8);
std::cout << "i is an int: ";
for (int i = 0; i<v.size();i++)
{
std::cout << v[i] << " ";
}
std::cout << std::endl;
std::cout << "i is an iterator: ";
for (std::vector<int>::iterator i = v.begin(); i!=v.end();i++)
{
std::cout << *i << " ";
}
std::cout << std::endl;
}
输出
i is an int: 1 4 8
i is an iterator: 1 4 8
一般来说,
- 使用其中一种方法有什么优势吗?
- 其中一个比另一个更快吗?
- 我什么时候应该使用
int
我什么时候应该使用iterator
?
最佳答案
使用迭代器的主要原因是提供通用性。特别是,通用算法可以使用迭代器遍历各种容器,迭代器的类型作为模板参数传递:
template <class InIt>
void print(InIt b, InIt e) {
while (b != e) {
std:cout << *b << ' ';
++b;
}
}
在这种情况下,您可以从迭代器中获得优势,因为您可以打印 list
或 map
(仅举几个示例)以及 vector
。
如果您直接使用已知类型的容器,那么这并不是真正的问题。如果您真的只是想打印出 vector 中的项目,那么使用整数对其进行索引就可以很好地工作。如果您要修改集合而不是仅仅读取其内容,那么使用索引而不是迭代器会具有优势。例如,如果您可能对循环内的 vector 执行 push_back
,则整数索引将保持有效,但迭代器可能会失效1。
但是,对于您所展示的情况,您可能需要考虑基于范围的 for
循环以避免使用索引或迭代器:
for (auto i : v)
std::cout << i << ' ';
1. 请注意,尽管标准迭代器确实如此,但如果您确实需要/想要的话,可以创建在这种情况下仍然有效的迭代器类型。例如:https://stackoverflow.com/a/7958561/179910
关于c++ - C++ 中整数循环和迭代器循环之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40160597/