Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的迭代器+;(stl)和Java,在概念上有区别吗? 我在离开一段时间后试图回到C++,试图抹去旧甜瓜。_Java_C++_Iterator_Iteration - Fatal编程技术网

C+中的迭代器+;(stl)和Java,在概念上有区别吗? 我在离开一段时间后试图回到C++,试图抹去旧甜瓜。

C+中的迭代器+;(stl)和Java,在概念上有区别吗? 我在离开一段时间后试图回到C++,试图抹去旧甜瓜。,java,c++,iterator,iteration,Java,C++,Iterator,Iteration,在Java迭代器中,是一个容器的接口,该容器具有以下方法:hasNext()、next()和remove()。hasNext()的存在意味着它对所遍历的容器具有限制的概念 //with an Iterator Iterator<String> iter = trees.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); } 有趣的部分是C++中指针是数组的迭代器。STL采用了现有的技术

在Java迭代器中,是一个容器的接口,该容器具有以下方法:
hasNext()
next()
remove()
hasNext()
的存在意味着它对所遍历的容器具有限制的概念

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

有趣的部分是C++中指针是数组的迭代器。STL采用了现有的技术,并围绕它建立了惯例


我是否还遗漏了更多的微妙之处?

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

请参阅中的迭代器概念:

  • 输入迭代器
  • 输出迭代器
  • 前向迭代器
  • 双向迭代器
  • 随机存取迭代器

与Java/C的微不足道的迭代器相比,这些迭代器更有趣、更强大。希望这些约定将使用C++0x进行编码。

迭代器仅在按顺序迭代数组内容的简单情况下等效于指针。迭代器可以从任何数量的其他来源提供对象:从数据库、从文件、从网络、从其他计算等等。

指向数组元素的指针实际上是数组的迭代器

正如你所说的,在java中,迭代器比C++更能了解底层容器。C++迭代器是通用的,一对迭代器可以表示任何范围:这可以是容器的子范围,在多个容器上的范围(见或),甚至是一系列的数字(参见)


迭代器类别确定了使用给定迭代器可以做什么和不能做什么。

也许更符合理论。从数学上讲,C++中的集合可以被描述为一个半开放的迭代器区间,即指向集合开始的一个迭代器和指向最后一个元素后面的一个迭代器。 这项公约开辟了许多可能性。算法在C++中的工作方式,它们都可以应用到更大的集合的子序列中。要在Java中实现这一点,必须围绕现有集合创建一个包装器,该包装器返回不同的迭代器

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

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

总而言之,C++提供了比C指针或java迭代器更广泛和更复杂的概念。

< P> C++库(以前称为STL的部分)迭代器被设计成与指针兼容。没有指针算法的Java可以自由地对程序员更加友好


<>在C++中,你必须使用一对迭代器。在Java中,可以使用迭代器或集合。迭代器被认为是算法和数据结构之间的粘合剂。为1.5+编写的代码很少需要提到迭代器,除非它实现了特定的算法或数据结构(大多数程序员不需要这样做)。由于java是动态多态子集,所以更容易处理。

< P>我的根本区别是java迭代器指向项目之间,而C++ STL迭代器指向项目。

< P> C++迭代器是指针概念的泛化;它们使其适用于更广泛的情况。这意味着它们可以用来定义任意范围

java迭代器是相对哑枚举器(虽然不如C++的坏;至少java有ListItter,可以用来对集合进行变异)。如前面提到的,java和C迭代器描述了一个混合位置(状态)和范围(值),而C++迭代器则分离了位置和范围的概念。C++迭代器表示“我现在在哪里”,与“我能去哪里?” 无法复制Java和C#迭代器。您无法恢复以前的位置。常见的C++迭代器可以.< /强>

考虑:

//用于vec中的每个元素
对于(iter a=vec.begin();a!=vec.end();++a){
//关键步骤!我们稍后将重新访问“a”。
iter cur=a;
无符号i=0;
//打印3个元素
对于(;cur!=vec.end()&&i<3;++cur,++i){

cout关于这些差异,有很多很好的答案,但我觉得Java迭代器最让我恼火的一点没有被强调——您不能多次读取当前值。这在很多情况下都非常有用,尤其是在合并迭代器时

C++中,你有一个方法来推进迭代器并读取当前值。读取它的值并不推进迭代;因此你可以多次读取它。java迭代器是不可能的,我最终创建了这样的包装器。


旁注:创建包装器的一个简单方法是使用现有的包装器——来自Guava。

Java库有一个随机访问和双向的ListIterator。“随机访问和双向”这是一个矛盾。你的意思是ListIterator是双向的,并提供读写访问。注意:ListIterator不包括“双向”的所有要求。它不支持复制--即,你不能保存当前位置以便以后重新访问。请参阅下面的单独答案。你几乎是自己说的。在Java中范围和迭代器的概念对我来说非常重要
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
}
// 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";
}