C++(stl)与Java中的迭代器,在概念上有区别吗?

2022-09-01 08:13:58

在离开一段时间并试图除去旧甜瓜之后,我将回到c ++。

在 Java 中,迭代器是一个容器的接口,具有方法:、 和 。的存在意味着它具有被遍历容器的限制的概念hasNext()next()remove()hasNext()

//with an Iterator
Iterator<String> iter = trees.iterator();
while (iter.hasNext()) 
{
    System.out.println(iter.next());
}

在C++标准模板库中,迭代器似乎表示支持和的数据类型或类,但没有内置的限制概念,因此在进入下一项之前需要进行比较。在正常情况下,用户必须通过比较两个迭代器来检查限制,第二个迭代器是容器端。operator++operator==

vector<int> vec;
vector<int>::iterator iter;

// Add some elements to vector
v.push_back(1);
v.push_back(4);
v.push_back(8);

for (iter= v.begin(); iter != v.end(); iter++)
{
    cout << *i << " "; //Should output 1 4 8
}

这里有趣的部分是,在C++指针是指向数组的迭代器。STL采用了现有的东西,并围绕它建立了惯例。

我错过了什么更微妙的地方吗?


答案 1

也许更理论化一点。从数学上讲,C++中的集合可以描述为迭代器的半开间隔,即一个指向集合开始的迭代器和一个指向最后一个元素后面的迭代器。

这一惯例开辟了许多可能性。算法在C++中的工作方式,它们都可以应用于较大集合的子序列。要使这样的事情在Java中工作,您必须围绕返回不同迭代器的现有集合创建一个包装器。

迭代器的另一个重要方面已经被Frank提到过。迭代器有不同的概念。Java迭代器对应于C++的输入迭代器,即它们是只读迭代器,一次只能递增一步,不能倒退。

在另一个极端,你有C指针,它们完全对应于C++的随机访问迭代器的概念。

总而言之,C++提供了一个更丰富、更纯粹的概念,可以应用于比C指针或Java迭代器更广泛的任务。


答案 2

是的,在概念上有很大的不同。C++利用了迭代器的不同“类”。有些用于随机访问(与Java不同),有些用于前向访问(如java)。而其他用于写入数据(用于,例如,)。transform

请参阅C++文档中的迭代器概念:

  • 输入迭代器
  • 输出迭代器
  • 前向迭代器
  • 双向迭代器
  • 随机访问迭代器

与Java / C#的小迭代器相比,它们更加有趣和强大。希望这些约定将使用C++0x的概念进行编码。