我回到c++后走一点,并试图灰尘老瓜。

在Java迭代是一个界面,用于一个容器具有方法:hasNext(),接下来(),并删除().存在hasNext()意味着它 有的概念,一个极限 对于容器被走.

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

在C++的标准模板图书馆,迭代似乎代表一个数据类型或类别的支持操作人员++和操作人员==而已 没有概念的限制 建立在这样的比较之前,需要推进到下一个项目。该限制已经检查的用户比较两个迭代,在正常情况的第二次迭代,是容器结束。

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采取了什么是现有的和建立《公约》。

它没有任何进一步的微妙此,我失踪了?

有帮助吗?

解决方案

是的,有一个大概念差异。C++使用了不同"阶层"的迭代器。一些被用于随机存取(同Java),有些是用于向访问(如java)。同时,即使他人是用于编写数据(用于,比如说, transform).

看到迭代的概念 C++的文件:

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

这些更有趣的和强大的比较Java/C#'s微不足道的迭代器。我们希望这些公约将编纂成文的使用C++0x的 概念.

其他提示

也许有点更多的是理论上的。数学上,集合在C++可以被描述为一个半开放的间隔时间的迭代,即一个迭代的指点,以开始收集和一个迭代的指点 只是在背后 最后一个元素。

这个《公约》开启了主机的可能性。的方式算法的工作在C++,他们都可以应用于子序列的一个较大的集合。做这种事的工作中爪哇,你必须创建一个包围绕现有的收集,返回一个不同的迭代器。

另一个重要方面的迭代已经提到过弗兰克。有不同的概念的迭代器。Java迭代对应C++'输入迭代,即他们只读迭代,只能增加一个步骤的时间不能倒退。

在另一极端,你必须C指针,这完全对应C++'概念的一个随机访问迭代器。

所有在所有、C++提供一个更加丰富和更纯洁的概念可以应用到更广泛的各种任务,比任何C指针或Java迭代器。

如前所述,Java和C#迭代描述的一种混合的位置(国)和范围(价值),而C++迭代独立的概念的位置和范围。C++迭代表表示'我在哪里现在'分别从'我在哪里可以走了吗?'.

Java和C#迭代不可复制。你不可能恢复先前的位置。公共C++的迭代。

考虑 这个例子:

// for each element in vec
for(iter a = vec.begin(); a != vec.end(); ++a){
  // critical step!  We will revisit 'a' later.
  iter cur = a; 
  unsigned i = 0;
  // print 3 elements
  for(; cur != vec.end() && i < 3; ++cur, ++i){
      cout << *cur << " ";
  }
  cout << "\n";
}

点击链接,看到计划产出。

这相当愚蠢的循环经过顺序(采用向前迭代语义仅)、印刷每个连续的序列的3件一(和几个较短的子序列在结束)。但是假设的N元,和M每线而不是3,此种算法将仍然是O(N*M)迭代的增量,并O(1)空间。

Java式的迭代没有能力为存储位置独立。你要么

  • 失去了O(1)空间,使用(例如)一系列的大米储存的历史作为你迭代
  • 将需要穿越列N次,使O(N^2+N*M)的时间
  • 或者使用具体数据类型与GetAt件的功能,失去genericism和能力使用链接表的容器类型。

因为只有前进的迭代机制都使用这个例子中,我能够交换在一个列表 没有问题.这是至关重要创作的通用算法,例如搜查、推迟初始化和评价、排序等。

不能保留国家对应关系最密切的C++STL输入迭代,在其中极少数的算法。

指向一个阵元确实是一个迭代进入阵列。

正如你所说,在爪哇,一个迭代有更多的知识基础的容器比在C++。C++迭代程序是一般性的,而一个 的迭代可以表示任何范围:这可能是一个子范围的一个容器、范围内在多个容器(见 http://www.justsoftwaresolutions.co.uk/articles/pair_iterators.pdfhttp://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/zip_iterator.html)或甚至一系列号码(见 http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/counting_iterator.html)

迭代分类确定你可以和不可以做给定的迭代器。

我根本区别是,Java迭代点项目之间的,而C++STL迭代点的项目。

C++迭代程序是一个概括的指针的概念;他们让它适用于范围更广的情况。这意味着他们可以被用来做这样的事情,因为任意的定义的范围。

Java迭代都比较笨员(虽然不是那么坏,因为C#'s;至少Java有ListIterator和可用于改变了收集)。

迭代只相当于指针在微不足道的情况下,重复的内容的一系列顺序。一个迭代可以提供的对象的任何数量的其他资料来源:从一个数据库,从一个文件,从网络,从一些其他计算,等等。

C++图书馆(该部分以前称为STL)迭代的设计可兼容的指针。Java,而不指运算,有自由,更多的程序。

C++你最终不必使用对迭代器。在Java你要么使用一个迭代或集合。迭代都应该是胶水之间的算法和数据的结构。代码写的1.5+很少需要更迭代,除非它是实现特定算法或数据结构(它的变化大多数程序都没有必要做)。作为Java去的动态性子集并等的更容易处理。

有很多好的答案有关的差异,但是我觉得事情让我很烦的最Java迭代不强调的--你可以不读的当前值多次。这是真正有用的,在很多情况下,尤其是当你们合并迭代器。

C++,你有一个方法前进的迭代和阅读目前的价值。阅读其价值不提前的迭代;所以你可以读它多次。这是不可能的Java迭代,我结束创造的包装,这样做。

一侧注意:一个简单的方法来创建一个包装是使用现有一个--PeekingIterator 从番石榴。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top